如何在具有多个IP的机器上控制ZeroMQ数据包的源IP地址?
- 2024-12-02 08:41:00
- admin 原创
- 151
问题描述:
Python 标准库的socket
.create_connection()
方法有一个源地址选项,用于控制连接使用哪个源 IP。
给定一台具有多个地址的机器,如何使用 Python ZeroMQ 套接字执行相同的操作?
在这种情况下,我一直在使用 Linux 的 iproute2ip addr add
来创建地址和 ZeroMQPUB/SUB
套接字原型。
解决方案 1:
socket
好吧,ZeroMQ 作为“交易对手”读起来有点棘手(但事实并非如此)
为什么?
古典音乐socket
是一种可以免费利用的资源。
ZeroMQ 是一个相当复杂的思想和行为原则层次结构(更好地说是分布式行为),它有助于设计智能分布式计算系统,而无需触及低级(ZeroMQ 很好地抽象)细节,这些细节控制着所有分布式计算系统都面临的恶劣条件风暴中事件的实际流动(并且必须在低层次上进行处理,如果要实现 ZeroMQ“承诺”的高级抽象,并让设计人员的思想更专注于他/她的核心应用部分,而不是重新设计轮子(经过所有的反复试验)来控制 O/S 资源并摇动系统服务以收集一些低垂的果实)。
出于这些原因,最好直接忘记 ZeroMQ 是“类似的东西socket
-”
不到五秒钟的 ZeroMQ 层次结构
1:
ZeroMQ 承诺轻松重用一些简单的可扩展正式通信模式原型,提供特定的分布式行为{ PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP }
。
2:除了专门使用无设备
传输类
的情况外,在所有其他情况下,ZeroMQ 都需要一个或多个可调“引擎”实例- a ,。 inproc://
Context( nIOthreads = N )
N >= 1
3:
有了这个,任何(未来的套接字)接入点都可以被实例化,从诞生的那一刻起就带有行为原型:
aSubscribeCHANNEL = aLocalCONTEXT.socket( zmq.SUB ) # this is NOT a <SOCKET>
# ^^^^^^__________________ even it was typed in
4:在本地“引擎
”的“内部”准备好
一个“接入点”实例后,就可以在外部现实中锁定它的实现,使用一个或多个(是的,更多……哇!意味着更多传入的拉线进入/从单个接入点“行为节点”吹出的哨声)调用以下任一方法:
或
.bind(
<transport-class>://<a-class-specific-address>
)
.connect(
<transport-class>://<a-class-specific-address>
)
5:
当且仅当.bind()
-RTO-ready 接入点 A被第一个实时-RTO-ready 接入点 B “访问”时,且具有任何匹配的行为配对,则 ZeroMQ 消息/信令原型将处于活动状态(将其命名为套接字也可能是出于历史原因,以便于解释).connect()
(PUB/PUB
出于显而易见的原因,永远不会合适,而PUB/SUB
许多其他行为原型对将会完美匹配并形成相互“兼容”的行为,这些行为最终将会持续下去)
那么,如果一台机器有多个地址,我该如何使用 Python ZeroMQ 套接字执行同样的事情?
只需在方法调用中使用完全限定的规范就可以了。
.bind(
"{ tcp | pgm | epgm }://<ip>:<port#>"
)
就这么简单。
很酷,不是吗?
在性能调整、延迟削减和安全调整的背后还有许多其他令人惊喜的事物。
解决方案 2:
当尝试.connect()
远程时,我在协议文档中找到了答案,将源 IP 放在连接字符串中的分号前:
rc = zmq_connect(socket, "tcp://192.168.1.17:5555;192.168.1.1:5555")
在 Python 中,它看起来像这样:
socket = zmq.Context().socket(zmq.SUB)
socket.connect('tcp://192.168.1.17:5555;192.168.1.1:5555')