远程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
2
local watch_server = require "skynet-fly.rpc.watch_server"
watch_server.publish("test_pub", "hello test_pub", 1) --推送test_pub事件,传递参数 hello test_pub,1

sub订阅端

1
2
3
4
--监听 test_server 服务端  的 test_pub事件,绑定回调处理名为handle_name1
watch_client.watch("test_server", "test_pub", "handle_name1", function(cluster_name, strarg1, numberarg2)
log.info("watch msg handle_name1 >>>> ", cluster_name, strarg1, numberarg2)
end)

subsyn/pubsyn

pubsyn推送同步端

1
2
local watch_server = require "skynet-fly.rpc.watch_server"
watch_server.pubsyn("test_syn", "hello test_syn", 1) --推送同步test_syn事件,传递参数 hello test_syn,1

subsyn推送同步订阅端

1
2
3
4
5
   local watch_syn_client = require "skynet-fly.rpc.watch_syn_client"
--监听 test_server 服务端 的 test_syn事件,绑定回调处理名为handle_name1
watch_syn_client.watch("test_server", "test_syn", "handle_name1", function(cluster_name, strarg1, numberarg2)
log.info("watch msg handle_name1 >>>> ", cluster_name, strarg1, numberarg2)
end)

详细使用示例

使用注意点

当自身是旧服务时,watch_client的订阅将接收不到,将只会发到新服务中

修改记录

2024/8/9

watch_syn_client
当触发move转移同步时,如果自身服务是旧服务,就取消同步监听。因为旧服务不能切服,因为存在这个问题


远程sub/pub 模式 和 远程subsyn/pubsyn 模式
https://huahua132.github.io/2024/06/29/skynet_fly_word/word_3/N_frpc_watch/
作者
huahua132
发布于
2024年6月29日
许可协议