我们有兴趣听听ActiveMQ与RabbitMQ和ZeroMQ的优缺点.还欢迎有关任何其他有趣的消息队列的信息.
我正在涉及过程到过程的沟通; 目标是让工作进程执行一些计算并将结果传回控制进程.我安装了zeromq.node并在coffeescript中设置了一个简单的请求者和响应者.
请求者:
# requester.coffee
zmq = require 'zmq'
context = new zmq.Context()
socket = zmq.socket 'req'
socket.bind 'tcp://127.0.0.1:5555', ( error ) =>
throw error if error?
console.log 'Requesting writer bound to port 5555'
setInterval ( -> socket.send 'helo world' ), 1
response_count = 0
t0 = new Date() / 1000
socket.on 'message', ( message ) ->
response_count += 1
# x = message.toString 'utf-8'
if response_count % 1000 is 0
t1 = new Date() / 1000
console.log …Run Code Online (Sandbox Code Playgroud) 我目前面临一个问题,我可以肯定有一个正式名称,但是我不知道该在网上搜索什么。我希望如果我描述问题和解决方案时想到的,有人能够告诉我设计模式的名称(如果有一个与我要描述的内容相匹配的设计模式)。
基本上,我想拥有一个工作队列:我有多个创建工作的客户端(发布者),以及许多处理这些工作的工人(消费者)。现在,我想将发布者创建的作业分发给各个使用者,这基本上可以使用几乎任何消息队列并在整个队列中实现负载均衡,例如使用RabbitMQ甚至MQTT 5。
但是,现在事情变得复杂了……每个工作都指向一个外部实体,例如一个用户。我想要的是按顺序处理单个用户的作业,但并行处理多个用户的作业。我不要求用户X的作业始终去工作者Y,因为无论如何它们都应按顺序处理。
现在,我可以使用RabbitMQ及其一致的哈希交换来解决此问题,但是当新的工作人员进入集群时,我就会进行数据竞赛,因为RabbitMQ不支持重新定位已经在队列中的作业。
MQTT 5也不支持:在这里,这个想法被称为“粘性共享订阅”,但这不是官方的。它可能是MQTT 6的一部分,也可能不是。谁知道。
我也看过NSQ,NATS和其他一些经纪人。他们中的大多数甚至都不支持这种非常特定的情况,而那些确实使用一致哈希的情况,则存在前面提到的数据竞速问题。
现在,如果代理在作业到达后不将作业分类到队列中,而是跟踪某个特定用户的作业是否已经在处理中,则问题将消失:如果这样,它将延迟所有其他作业该用户,但其他用户的所有作业仍应处理。使用RabbitMQ等人无法做到这一点。
我很确定我不是唯一拥有用例的人。例如,我可以想到用户将视频上传到视频平台,尽管上传的视频是并行处理的,但单个用户上传的所有视频都是按顺序处理的。
因此,简而言之:我所形容的名字是用一个普通名字吗?诸如分布式作业队列之类的东西?具有任务相似性的任务调度程序?还是其他?我尝试了很多术语,但没有成功。这可能意味着没有解决方案,但是如上所述,很难想象我是这个问题上唯一的人。
有什么想法我可以寻找吗?并且:是否有实现此目的的工具?有协议吗?
PS:仅使用预定义的路由密钥是不可行的,因为用户ID(我在这里只是作为一个示例)基本上是UUID,因此可以有数十亿个,因此我需要更多动态的东西。因此,一致性哈希基本上是正确的方法,但是如上所述,为了避免数据争用,分发必须逐个进行而不是预先进行。
distributed design-patterns message-queue dispatcher job-queue
我有一个Java应用程序,需要在不同进程之间进行通信.进程可以在相同的JVM或不同的JVM中运行,但可以在同一台机器上运行.
我的应用程序需要将"消息"提交给另一个进程(相同或不同的JVM)并忘记它.类似于IBM"MQ"之类的消息传递队列,但是简单,只使用内存,没有IO到硬盘以获得性能提升.
我不确定Performance prescriptive的最佳方法是什么.
还有其他想法吗?
performance ×2
zeromq ×2
coffeescript ×1
dispatcher ×1
distributed ×1
ipc ×1
java ×1
javascript ×1
jms ×1
job-queue ×1
mq ×1
rabbitmq ×1
rmi ×1