我有 10 条消息/秒(总活动)来自 40 个客户端的 TCP。我需要接收每条消息并执行 5 秒的过程(查找 Web 服务,执行一些 DB 查询,最后将结果写入 DB)。
如何区分来自慢 5 秒进程的消息?此外,我可能会在已经为该客户端处理消息的同时收到来自客户端的另一条消息。我永远不想丢失消息。
我有 10 条消息/秒(总活动)来自 40 个客户端的 TCP。我需要接收每条消息并执行 5 秒的过程(查找 Web 服务,执行一些 DB 查询,最后将结果写入 DB)。
如何区分来自慢 5 秒进程的消息?此外,我可能会在已经为该客户端处理消息的同时收到来自客户端的另一条消息。我永远不想丢失消息。
使用 Twisted,答案是简单地做你想做的事:
from twisted.python.log import err
from twisted.internet.protocol import Protocol
class YourProtocol(Protocol):
...
def messageReceived(self, message):
d = lookupWebService(message)
d.addCallback(queryDatabase)
d.addCallback(saveResults)
d.addErrback(err, "Servicing %r failed" % (message,))
您可以在 中找到用于与 Web 服务交互的 API twisted.web.client
(假设“Web 服务”是您使用 HTTP 客户端与之交谈的东西)。您可以在twisted.enterprise.adbapi
. 你可以通过谷歌搜索找到与其他类型的数据库交互的 API。
使用Divide and Conqueur并行分配任务。
许多说明这种方法的python示例,请在此处阅读:
您还可以使用 ROUTER/DEALER 代理分发任务。到达代理的消息被公平排队并在下游工作人员之间分发,没有回话;这种方法可能更适合您的需求。