对于这种情况,我应该使用哪种 ZMQ 模式?
Which ZMQ pattern should I use for this scenario?
我是 ZMQ 和多线程设计的新手,所以我希望对我的场景的设计模式有一些见解:
我有一个用作中间件的服务器,它将以固定速率从数据库接收外部数据,然后将数据转发给连接的客户端。服务器会做一些过滤,让每个客户端只接收一部分数据;有时客户端在收到数据后也会发回响应,服务器需要处理响应并将其存储到数据库中。
由于每秒可能有数百个客户端连接到服务器,我正在考虑在服务器-客户端部分使用Router-Dealer模式;至于服务器数据库部分,可能使用一个工作线程来接收外部数据并通过"inproc"协议将其转发给服务器内部的其他工作线程是个好主意?
如有任何建议,我们将不胜感激!
不了解所有细节就很难回答,但这里有一些提示可能会让您朝着正确的方向前进。
您可以考虑使用 zmq_poll()
使用多路复用,而不是使用线程。我猜这是 PyZMQ 中的 zmq.Poller
。这通常比线程更容易设置。如果中间件不必为每条消息做很多工作,这是一个不错的选择。您还可以结合这两种方法:一组有限的线程,其中每个线程使用多路复用处理多个连接。
如果流量不是严格的请求-响应,Router-Dealer 是一个不错的选择。也可以考虑在客户端和服务器之间使用多套接字连接,例如:
- 从中间件到客户端更新的推拉式连接。
- 用于从客户端到中间件的响应的推拉式连接。
我是 ZMQ 和多线程设计的新手,所以我希望对我的场景的设计模式有一些见解:
我有一个用作中间件的服务器,它将以固定速率从数据库接收外部数据,然后将数据转发给连接的客户端。服务器会做一些过滤,让每个客户端只接收一部分数据;有时客户端在收到数据后也会发回响应,服务器需要处理响应并将其存储到数据库中。
由于每秒可能有数百个客户端连接到服务器,我正在考虑在服务器-客户端部分使用Router-Dealer模式;至于服务器数据库部分,可能使用一个工作线程来接收外部数据并通过"inproc"协议将其转发给服务器内部的其他工作线程是个好主意?
如有任何建议,我们将不胜感激!
不了解所有细节就很难回答,但这里有一些提示可能会让您朝着正确的方向前进。
您可以考虑使用 zmq_poll()
使用多路复用,而不是使用线程。我猜这是 PyZMQ 中的 zmq.Poller
。这通常比线程更容易设置。如果中间件不必为每条消息做很多工作,这是一个不错的选择。您还可以结合这两种方法:一组有限的线程,其中每个线程使用多路复用处理多个连接。
如果流量不是严格的请求-响应,Router-Dealer 是一个不错的选择。也可以考虑在客户端和服务器之间使用多套接字连接,例如:
- 从中间件到客户端更新的推拉式连接。
- 用于从客户端到中间件的响应的推拉式连接。