我有一个"主要"过程和一些工人"我希望传递一些消息的过程。消息可以是二进制blob,但每个都有固定的大小。我想要一个抽象,它会整齐地缓冲并为我分离出每条消息。我不想在TCP之上发明我自己的协议,我找不到任何可以跨语言移植的简单+轻量级解决方案。 (截至目前," main"进程是一个Node.js服务器," worker"进程计划在Python中。)
答案 0 :(得分:1)
这个问题纯粹基于意见,但无论如何我都会试一试:
WebSocket是一个矫枉过正的imo。首先,为了使WebSockets工作,你必须实现HTTP(或至少它的一些基本形式)来进行握手。如果你这样做,那么最好坚持"正常" HTTP,除非有全双工通信的原因。到处都有很多工具可以处理HTTP over(unix domain)套接字。
但这也可能是一种过度杀伤力。如果你有工人,那么我认为性能很重要。最简单且(可能)最有效的解决方案是以下协议:每条消息以1-8(选择一个数字)字节开头,这些字节决定了以下内容的大小。内容是您想要的任何内容,例如protobuf消息。例如,如果您要发送foo
,则发送0x03 0x00 0x66 0x6f 0x6f
。前两个字节对应于内容的大小(为3
),然后3个字节对应foo
。
答案 1 :(得分:0)
听起来你需要某种消息代理。
您对“缓冲”的要求将排除,例如,ZeroMQ(这是进程间通信的理想选择,但没有内置的消息持久性)。
如果您正好在AWS上,这将为您提供诸如RabbitMQ或SQS之类的选项。您也可以查看Kafka(AWS上的Kinesis)。这些服务都提供消息的“缓冲”,RabbitMQ提供最广泛的配置,但可能是最大的实现障碍。
另一种选择是将Redis用作简单的消息服务。
有许多选项,所有选项都适合不同的用例和环境。我应该补充说,“简单和轻量级”并不适合除了以下任何解决方案 - 也许 - ZeroMQ