集成模式
可用于此目的的集成模式很少。在
消息传递允许通过通信约定的消息进行解耦,其余的都作为平台特定的细节保留,这不会影响其他方。在
另一种方法可以是共享数据存储——一方将处理请求存储在那里,另一方将获取请求并进行处理。在
使用ZeroMQ的消息传递集成模式
ZeroMQ是一个库,允许非常轻量级的消息传递,而不需要运行一些大型消息传递应用程序。在
你所描述的可以这样解决:Python脚本正在循环中运行,等待执行某些操作的请求。在
任何客户机(能够发出ZeroMQ请求)都会请求操作并获得响应
由于客户机使用多种语言,您应该使用一些跨平台的序列化,结果缓冲区甚至更好的JSON字符串都是不错的选择。在
ZeroMQ有许多语言库,因此您应该能够进行通信。在
有一个很好的ZeroMQ Guide提供了概念的清晰解释,并显示了许多语言的实现。在
为了规划通信基础设施,我将从您的Python脚本绑定到某个TCP端口(被“固定”部分)和连接到该端口的客户端开始。在
Python脚本将使用REP socket(用于“reply”),您的客户机使用其他语言REQ socket。在
以下示例来自zguide中为多种语言编写的huge set of examples
Python服务器代码示例(hwserver.py):import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
# Wait for next request from client
message = socket.recv()
print("Received request: %s" % message)
# Do some 'work'
time.sleep(1)
# Send reply back to client
socket.send(b"World")
示例PHP客户端(hwclient.php):
^{pr2}$
共享数据存储集成
共享文件或数据库还允许进程之间进行通信。如果锁定资源、注意同一个任务不是由多个工人处理等,问题就变得复杂了
结论
有多种模式和多种平台需要实现。在数据库-你需要设置并运行它。对于一些小任务来说可能太多了。在
共享文件-可能与从多个进程共享文件发生冲突-如果多个进程尝试写入,则可能存在冲突。在
通过TCP或UDP套接字进行消息传递-冷工作,但实际上,这在技术上是非常重要的,因为它有许多必须解决的问题(当一方关闭时,重新连接…)
web服务上的消息传递-您可以设置web服务器,接受来自客户端的请求,在服务器上进行处理。对于快速任务来说,这是相当容易的,但是如果任务需要超过30秒,则可能会失败,并且必须使用某种消息传递将其转换为后台处理。在
中型和大型的消息传递系统(比如Celery with RabbitMQ、Redis…)-有很好的工具,在许多情况下可能会被过度使用
ZeroMQ上的消息传递—这是我的最爱—您可以用几行代码设置它,并且运行时不会出现太多问题—它可以解决诸如重新连接之类的问题。等等,例如参见full working example for distributed locker