snapper-core
Version:
Teambition push messaging service, backed by redis.
73 lines (53 loc) • 4.84 kB
Markdown
Snapper:Teambition 分布式消息推送系统
====
Teambition push messaging service, based on redis.
[![NPM version][npm-image]][npm-url]
[![Build Status][travis-image]][travis-url]
[![js-standard-style][js-standard-image]][js-standard-url]
[Snapper](https://github.com/teambition/snapper-core) 是 Teambition 开源的一个运行于 Node.js 环境的分布式消息推送系统。不同于 [kafka](https://github.com/apache/kafka)、[RabbitMQ](https://github.com/rabbitmq/rabbitmq-server)、[ActiveMQ](https://github.com/apache/activemq),Snapper 主要用于向浏览器端、移动端推送实时消息,目前正用于 Teambition Web 端消息推送,可以通过 https://push.teambition.com/ 查看当前运行的版本。
### 客户端
1. node.js 或浏览器端 [snapper-consumer](https://github.com/teambition/snapper-consumer)
2. iOS 端 [snapper-swift](https://github.com/teambition/snapper-swift)
3. Android 端 [snapper-android](https://github.com/teambition/snapper-android)
### Snapper 主要特点
1. 使用 JavaScript 开发,运行于 Node.js 环境;
2. 消息队列池、状态数据池基于 Redis,并使用 lua 脚本进行核心操作,特别高效;同时支持 Redis cluster,可以随着用户负载量横向扩展;
3. 分布式部署,利用 `nginx ip_hash` 可在同一台机器中运行多个进程,利用 LVS 等负载均衡可以运行于多台机器,可以随着用户负载量横向扩展;
4. 消息消费者 Consumer 客户端链接基于 Engine.IO 开发,使用 websocket 协议,自动重连,自动读取消息,另可支持 Android、iOS 客户端,;
5. 消息生产者 Producer 客户端基于 TCP 开发,内置消息队列,自动重连,确保消息发送到 Broker 服务器;
6. 基于 [JSON-RPC 2.0](http://jsonrpc.org/specification) 协议,确保消息按序推送,推送成功且仅推送一次;
7. 消息缓存机制,消费者断线重连后消息会自动送达(不会丢失),缓存时间可自定义,默认为 24 小时;
8. 基于 Room 广播消息,即同一个消息可以分发给在同一个 Room 中的多个消费者;
9. 同样基于 Room,对于同一个目标用户,支持建立多个消费链接,同一个消息可以同时推送到同一个用户的多个浏览器窗口,或各个移动端;
10. 实时统计用户在线状态:即时查询同一用户当前建立了多少个消费链接;
11. 客户端身份验证机制,Consumer 和 Producer 发起连接时都需要通过 token 验证身份。
相关特征细节见下文。
### 系统构成
Snapper 由四部分组成:
1. [snapper-core](https://github.com/teambition/snapper-core) 消息 broker,服务器端,消息系统的核心,与 producer 端建立 TCP 长连接接收 API 服务生产的消息,它与 consumer 端建立 websocket 长连接分发推送消息。
2. [snapper-producer](https://github.com/teambition/snapper-producer) 消息 producer,API 客户端,API 服务通过 producer 往 Brokers 推送消息。并为 consumer 端提供身份验证服务和 room 订阅服务。
3. [snapper-consumer](https://github.com/teambition/snapper-consumer) 消息 consumer,用户客户端,consumer 从 producer 获取 token,然后与 broker 建立长连接,并通过 producer 订阅相关 room,就能接收 producer 发送到 room 的消息。
4. Redis 服务,用于保存 rooms 和 consumers 的关系状态信息,也为每一个 consumer 建立消息缓存队列。
### 服务流程
Snapper 服务的基本流程如下:
1. 启动 snapper-core 服务;
2. API 服务通过 snapper-producer 对 snapper-core 发起 TCP 长连接,并进行身份验证;
3. 用户客户端向 API 请求 token,snapper-producer 生成 token 给用户,用户用 token 对 snapper-core 发起 websocket 长连接;
4. 用户客户端向 API 请求订阅相关 room,API 验证用户权限后通过 snapper-producer 转发请求给 snapper-core,从而用户与 room 建立关系;
5. API 通过 snapper-producer 往 snapper-core 的各个 room 推送消息,snapper-core 从 redis 读取 room 与用户的关系,从而把发给该 room 的消息分发给 room 内用户。
### [更多文档](https://github.com/teambition/snapper-core/blob/master/docs/snapper.md)
### Docker
build:
```sh
docker build -t teambition/snapper .
```
test:
```sh
docker run --rm -ti teambition/snapper bash -c 'node app.js & node rpc.js'
```
[npm-url]: https://npmjs.org/package/snapper-core
[npm-image]: http://img.shields.io/npm/v/snapper-core.svg
[travis-url]: https://travis-ci.org/teambition/snapper-core
[travis-image]: http://img.shields.io/travis/teambition/snapper-core.svg
[js-standard-url]: https://github.com/feross/standard
[js-standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat