ha-wechaty
TypeScript icon, indicating that this package has built-in type declarations

0.4.16 • Public • Published

HAWechaty

NPM Version NPM

HAWechaty

HAWechaty is a Load Balance for providing High Availability for Wechaty Chatbot by spreading requests across multiple WeChat individual accounts.

Powered by Wechaty Powered by Ducks

One two three, chatbots team up!

Background

How to delivering high levels of SLA uptime?

The Problem of Single Point Of Failure (SPOF)

We have serval issues when we providing a Chatbot service, like:

  1. Single Point Of Failure (SPOF)
  2. Heartbeat & Keepalive

1 Single Point Of Failure (SPOF)

The Problem #1

Currently we have only one bot on WeChat, which means that if the bot was offline, then our service will be stopped.

The Solution #1

Use two (3 or even 4 will be better) WeChat bot at the same time, with the different wechaty-puppet providers (for example: padlocal + windows).

So when an issue event has come, we can use a RR (round robin) or other very easy to implementing algorithm to make our service both load-balancable and high-available.

2 Heartbeat and Keepalive

  1. Heartbeat
  2. Keepalive

The Problem #2

When a Wechaty bot is started and logged in, it is mostly liked to be work as expected for sending/receiving messages.

However, sometimes it might run into trouble for some unknown reason, which caused it can not work anymore, but we have nothing to know about that.

In order to check whether a Wechaty bot is available, we need to take a test on it to see if it can send & receive the message successfully.

How can archive that? It is not a good idea if we send a message to another Wechaty bot because it is not stable enough for this kind of online service.

The Solution #2

We can set up an Official Account for WeChat, with an auto-responding strategy that will reply a dong when it receives a ding.

So we let our Chatie Official Account takes the responsibility to provide this service.

HAProxy Requirement

QR Code for ChatieIO WeChat Official Account

If you want to use HAProxy, please make sure every bot account has followed the ChatieIO WeChat Official Account by scanning the above QR Code.

Usage

import { HAWechaty } from 'ha-wechaty'
import { Wechaty } from 'wechaty'

const wechaty1 = new Wechaty({
  puppet: 'wechaty-puppet-service',
  puppetOptions: {
    token: 'puppet-service-token'
  }
})

const wechaty2 = new Wechaty({
  puppet: 'wechaty-puppet-padlocal',
  puppetOptions: {
    token: 'padlocal-token'
  }
})

// 1. Configure HAWechaty
const haWechaty = configureHa()
// 2. Add Wechaty instances to HA
haWechaty.add(wechaty1, wechaty2)
// 3. Start HA
await haWechaty.start()

// 4. Find room by our bots
const room = await haWechaty.Room.find({ topic: 'ding room' })
if (room) {
  // 5. Send message to room with load balancing and high availabilities
  await room.say('ding')
}

Environment Variables

1 HA_WECHATY_PUPPET

The wechaty puppet list, seprated by a colon (:).

Examples:

export HA_WECHATY_PUPPET=wechaty-puppet-service:wechaty-puppet-padlocal

2 HA_WECHATY_PUPPET_${PROTOCOL}_TOKEN

The ${PROTOCOL} could be the puppet name that the Wechaty supported.

For example:

Puppet Provider ${PROTOCOL} HA_WECHATY_PUPPET_${PROTOCOL}_TOKEN
wechaty-puppet-service puppet-service HA_WECHATY_PUPPET_SERVICE_TOKEN
wechaty-puppet-padlocal padlocal HA_WECHATY_PUPPET_PADLOCAL_TOKEN

The token set to this environment variable will become the default value of puppetOptions.token when instantiating Wechaty.

To specify more tokens for a specific puppet, use a colon (:) to separate them, for example:

export HA_WECHATY_PUPPET_SERVICE_TOKEN=service_token_1:service_token_2

Development

Redux Remote DevTools

npm run redux-devtools

Links

Back Off Alghorithm

  1. Googl Cloud - Truncated exponential backoff
  2. Power of RxJS when using exponential backoff

Redux

  1. Redux Best Practices
  2. Typesafe utilities for "action-creators" in Redux / Flux Architecture
  3. createAsyncEpic - Generic redux-observable factory handling async-actions - #162

RxJS Testing

  1. A better approach for testing your Redux code
  2. Marble testing with RxJS testing utils - You don’t need a third-party library for marble testing
  3. Testing RxJS Code with Marble Diagrams
  4. Extensive introduction to why and how you might want to use and test redux-observable
  5. Writing Better Marble Tests for Redux Observable and TypeScript

RxJS Operators

  1. RxJS recipes: ‘forkJoin’ with the progress of completion for bulk network requests in Angular
  2. Handle multiple API requests in Angular using mergeMap and forkJoin to avoid nested subscriptions
  3. Fun with RxJS's groupBy
  4. Here is what I’ve learn about groupBy operator by reading RxJS sources

History

master

v0.4 (Jun 7, 2020)

Ducksify Extension

  1. Work with Ducks
  2. High-available logics managed by RxJS (redux-observable epics)
  3. Redux example at examples/redux-ducks-bot/
  4. Ding Dong Bot example at examples/ding-dong-bot.ts

v0.0.1 (Apr 2020)

This module was originally design for the project OSSChat #58

  1. Publish the NPM module ha-wechaty

Author

Huan LI (李卓桓) zixia@zixia.net

Profile of Huan LI (李卓桓) on StackOverflow

Copyright & License

  • Code & Docs © 2020 Huan LI <zixia@zixia.net>
  • Code released under the Apache-2.0 License
  • Docs released under Creative Commons

Readme

Keywords

Package Sidebar

Install

npm i ha-wechaty

Weekly Downloads

26

Version

0.4.16

License

Apache-2.0

Unpacked Size

595 kB

Total Files

260

Last publish

Collaborators

  • zixia