0

我正在使用 pub/Sub 套接字,当前服务器订阅字节 [0](所有主题),而客户端订阅字节 [16] - 特定标题作为主题

但是,我无法阻止客户端订阅可以接收所有其他消息的字节 [0]。

我的应用程序就像一个应用程序游戏,它有一个使用 ZMQ 作为连接的服务器,并且许多客户端都有一个 ZMQ 套接字来与服务器通信。

在这种情况下我应该使用什么模式或套接字?

谢谢

4

1 回答 1

0

“ ...无法阻止客户端订阅可以接收所有其他消息的字节[0]。”


停止 SUB 客户端的“全部订阅”模式

对于 ZMQ PUB/SUB正式通信模式原型,SUB客户端必须提交其订阅请求( via zmq_setsockopt())。

PUB-side (游戏服务器)没有选择从它的角度这样做。

在创建新SUB套接字时没有订阅状态,因此是一个绝对限制性的过滤器,没有消息通过。(有关以下方法的更多详细信息SUBSCRIBE/UNSUBSCRIBE参考)


ZeroMQ 规范对此的详细设置:

int zmq_setsockopt (       void   *socket,
                           int     option_name,
                     const void   *option_value,
                           size_t  option_len
                     );

Caution: only ZMQ_SUBSCRIBE
              ZMQ_UNSUBSCRIBE
              ZMQ_LINGER
         take effect immediately,
         other options are active only for subsequent socket bind/connects.

ZMQ_SUBSCRIBE:建立消息过滤器

该选项应在套接字ZMQ_SUBSCRIBE上建立一个新的消息过滤器。ZMQ_SUB新创建的ZMQ_SUB套接字将过滤掉所有传入的消息,因此您应该调用此选项来建立初始消息过滤器。

长度为零 应订阅所有传入消息。option_value

非空 option_value应订阅以指定前缀开头的所有消息。

多个过滤器可以附加到单个ZMQ_SUB套接字,在这种情况下,如果消息匹配至少一个过滤器,则应接受该消息。

ZMQ_UNSUBSCRIBE删除消息过滤器

该选项应删除套接字ZMQ_UNSUBSCRIBE上现有的消息过滤器。ZMQ_SUB指定的过滤器必须与ZMQ_SUBSCRIBE先前使用该选项建立的现有过滤器相匹配。如果套接字连接了相同过滤器的多个实例,则该ZMQ_UNSUBSCRIBE选项应仅删除一个实例,将其余实例留在原处并正常运行。


如何强制执行临时的、服务器指定的 ZMQ_SUBSCRIBE 限制?

这可以通过扩展消息层和添加控制模式套接字来实现,该套接字将为客户端ZMQ_SUB消息过滤携带服务器启动的设置。

在接收到新的、服务器指示的ZMQ_SUBSCRIBE/ZMQ_UNSUBSCRIBE设置后,ZMQ_SUB客户端代码将简单地处理该请求并zmq_setsockopt()相应地添加。

这种方法的 FSA 驱动的语法有更多的可能性,因此任何游戏服务器/游戏社区都可以顺利地走这条路。


我应该使用什么模式或插座?

ZeroMQ 是一个乐高风格元素库,可以组装成更大的图景。

期望这样一个聪明的图书馆有一个千篇一律的忍者元素,仔细观察是矛盾的。

所以,为了避免添加“虽然这个……还有那个…… ”的“永无止境的故事”

  1. 查看端到端可扩展解决方案的所有要求和列表功能,

  2. 设计一个消息传递概念并对其进行验证以满足所有列出的要求并涵盖 [1] 中的所有功能

  3. 实施[2]

  4. 测试[3] 并纠正它以满足 1:1 端到端规范 [1]

  5. 享受它。你已经完成了端到端的权利。

于 2014-09-06T05:10:09.763 回答