livewin-chat(live 聊天室服务)
轻量化分布式消息订阅系统,订阅端使用websocket协议。
Features
Subscriber
需要唯一标识,Publisher
支持批量给多个Subscriber
发消息。Subscriber
可以订阅一个频道(Channel
),Publisher
给Channel
发消息,每一个在线Subscriber
都能收到消息。Publisher
还可以发广播消息(Broadcast
),每一个在线Subscriber
都能收到消息。
Note
注意这个livewin-chat
暂时不支持离线消息
架构设计
-
Broker
Broker
主要负责和客户端维护链接,接收消息并且推送给客户端。Broker
需要集群化以支持更多的连接数。为了好运维和拓展,Broker
还需要设计成stateless
,可以无限横向拓展,可以放在传统负责均衡后面,在k8s集群中可以在service后面。 -
Publisher_Api_Svc
Publisher_Api_Svc
作为发送信息的接收器,负责接收消息,并将消息推送到各个Broker
。Publisher_Api_Svc
需要感知到所有的Broker
并且和Broker
通过grpc
通讯,轻量化服务发现可以使用Mdns
实现(需要所有服务在同一个内网),这样中可以简化服务组件,大型系统可以使用etcd,consul
等服务发现组件,Publisher_Api_Svc
可以通过服务发现知道所有的Broker
地址。 -
架构延伸
超大型消息系统,可以在
Publisher_Api_Svc
和Broker
中加入异步消息系统,例如Publisher_Api_Svc
接收消息往kafka
发,再几个一个服务消费消息,往Broker
发消息。kafka
的topic
可以增加partition
来承载更大的消息处理量。
Run demo
start the terminal
$ go run bin/broker/main.go
start another terminal
$ go run bin/publisher_api_svc/main.go
run live server on example folder,it will open http://127.0.0.1:5500/example/index.html
in the browser。
start the third terminal
$ curl -d 'broadcast in channel message' 'http://localhost:9653/broadcastinchannel?channel=channel1'
$ curl -d 'broadcast message' 'http://localhost:9653/broadcast'
watch on the browser,it will got the messages。