如何设置 ZMQ PUB/SUB 模式以仅服务于预授权订阅者

How to setup a ZMQ PUB/SUB pattern to serve only for pre-authorized subscriber(s)

我如何在 PUB-[=27= 中实施或执行某种 "hack" ]SUB 模式以获得仅发布给 授权 订阅者,断开连接 未授权订阅者等的能力?

我用谷歌搜索了这个问题,但所有答案都与在订阅者端设置订阅过滤器非常相似。

但我想,正如我所说,只向那些通过授权或有一些秘密的客户发布我在 PUB 的更新 key,已在 REQ-REP[ 中收到=33=].

感谢任何想法。

Read Chapter 5 of The Guide,特别是名为 "Pros and Cons of Pub-Sub".

的部分

你试图以你试图完成它的方式来完成的事情有很多问题(但有解决方案,如果你愿意改变你的架构)。

  • 大概您需要 PUB 套接字可以被世界普遍访问,无论是整个世界还是仅由一些已授权套接字和一些未授权套接字组成的世界。 如果没有,您可以将对 PUB 套接字本身的访问(通过防火墙)控制为仅授权 machines/sockets。
  • 当一个PUB套接字接收到一个新的连接时,它并不知道订阅者是否被授权。 PUB 无法接收来自 SUB 套接字的实际通信,因此 SUB 套接字无法直接传达其授权。 XPUB/XSUB 套接字打破了这个限制,但它不会帮助你(见下文)。
  • 无论您如何将 SUB 套接字的授权传递给 PUB 套接字,我都不知道有什么方法 PUB 套接字可以终止或忽略 SUB 套接字的连接,如果它没有被授权。 这意味着不受信任的 SUB 套接字可以订阅 ALL ('') 并从 PUB 套接字接收所有消息,而 PUB 套接字对此无能为力。 如果信任 SUB套接字来监管自己(你创建连接套接字并控制它部署的机器),那么你可以选择订阅一个"control"主题,发送授权,PUB套接字反馈允许订阅的channels/topics。

因此,这几乎扼杀了它在可公开访问的 PUB/SUB 范例中实现一般安全性。

以下是您的选择:

  1. 放弃 PUB/SUB - 在发送端(据我所知),您可以准确控制每次发送给哪个对等方的唯一方法是带 ROUTER 插座。如果你使用 ROUTER/DEALER,DEALER 套接字可以发送它的授权,ROUTER 套接字将其与它的 ID 一起存储,当需要发送某些东西时,它只是找到所有已连接的已授权套接字并按顺序发送它,给他们每个人。这是否可行取决于套接字的数量和工作负载(消息的大小和数量)。
  2. 加密您的消息 - 您已经说过这是最后的手段,但这可能是唯一可行的答案。正如我上面所说,任何可以访问您的 PUB 套接字的 SUB 套接字都可以订阅所有 ('') 正在发送的消息,而不会受到监督。您无法有效地隐藏您的 PUB 套接字 address/port,您无法隐藏通过该 PUB 套接字发送的任何消息,但您可以通过加密隐藏这些消息的内容。密钥共享的正确方法取决于您的情况。

Jason 向您展示了关于原因的精彩评论(不要忘记为他出色的回答加 1,好吗?),让我补充两分钱:

问:如何?

A:忘记 PUB/SUB 原型并创建一个特定案例

是的。 ZeroMQ 是一个非常强大的 can-do 工具箱,而不是一盒糖果,你被禁止品尝和选择 assemble 你的下一个超级代码。

这样一来,您的代码就可以并且仍然有权为无法控制的 SUB 端代码行为设置控件和措施。

创建自己的、复合的、分层的消息传递解决方案是 ZeroMQ 为您的设计带来的强大力量。在那里你意识到你是分布式系统设计的大师。除了学术示例之外,没有人使用普通的原始行为原型,但通常会为生产级解决方案编写更健壮且符合现实的复合消息传递模式。

没有简单的一行代码可以使您的系统用例正常工作。


虽然它不需要回答您的所有详细信息,但您可能需要阅读备注

  • on managing PUB/SUB connections
  • on ZeroMQ authorisation measures.