远程sub/pub 模式 和 远程subsyn/pubsyn 模式
前言
有时候,一些事件的通知目标是不确定或者增量的,此时就需要用到订阅发布模式(sub/pub),发布者只负责发布事件数据,谁关心此事件,订阅即可。
对比redis
redis也支持sub/pub模式,并且有psub批量订阅支持。
skynet_fly目前只实现了sub/pub模式,后续如果发现有非常硬性需要psub也可以考虑实现一下。
不过skynet_fly实现了redis没有的功能,subsyn/pubsyn订阅同步模式。同步模式和订阅发布模式的区别是:
订阅同步模式
订阅的事件只要发布了一次,就一定能拿到值,回调通知不保证每次发布都能接收,保证接收到最后一次发布值。订阅模式
订阅之前的发布消息接收不到,保证订阅后的消息都能接收。
优劣对比
redis
优点
1. 依赖redis,可以跨语言,跨框架使用。
2. 支持psub模式。
缺点
1. 发布事件值,只能是string,需要额外用json等等协议做中转。
2. 每个监听都需要一个连接。对于skynet内部服务多的情况不适用。
skynet_fly
优点
1. 直达,不依赖服务转发。
2. 内部frpc_client_m接收,分发给各订阅的内部服务,不存在多内部服务同时订阅,连接数上升,网络带宽占用上升问题。
3. 消息支持lua可打包的数据类型(string,number,bool,table)。
4. 支持订阅同步模式。
缺点
1. 通用性不强,只支持使用skynet_fly的服务。
2. 暂时不支持psub模式。
简单使用示例
sub/pub
pub推送端
1 |
|
sub订阅端
1 |
|
subsyn/pubsyn
pubsyn推送同步端
1 |
|
subsyn推送同步订阅端
1 |
|
详细使用示例
使用注意点
当自身是旧服务时,watch_client的订阅将接收不到,将只会发到新服务中。
修改记录
2024/8/9
watch_syn_client
当触发move
转移同步时,如果自身服务是旧服务,就取消同步监听。因为旧服务不能切服,因为存在这个问题