Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 消息传递模式问题_Design Patterns_Messaging_Rabbitmq_Tibco - Fatal编程技术网

Design patterns 消息传递模式问题

Design patterns 消息传递模式问题,design-patterns,messaging,rabbitmq,tibco,Design Patterns,Messaging,Rabbitmq,Tibco,进程A正在计算对象a1、a2、a3等的值,并将结果发送到中间件队列(RabbitMQ)。使用者读取队列并进一步处理这些结果。 进程A必须定期发送这些值的快照,以便使用者可以进行其他计算。这些对象的值可能会独立更改。队列可能看起来像a1,a1,a2,a1,a2,a2,a2,a3。。。消费者处理队列中的每个项目。快照必须包含所有对象,使用者将一次性处理所有对象的此消息 所以要求有这样一个队列:a1,a1,a3,a2,a2,[快照,a1,a2,a3],a3,a1。。。问题在于,这些项的类型不同:一种用

进程A正在计算对象a1、a2、a3等的值,并将结果发送到中间件队列(RabbitMQ)。使用者读取队列并进一步处理这些结果。 进程A必须定期发送这些值的快照,以便使用者可以进行其他计算。这些对象的值可能会独立更改。队列可能看起来像a1,a1,a2,a1,a2,a2,a2,a3。。。消费者处理队列中的每个项目。快照必须包含所有对象,使用者将一次性处理所有对象的此消息

所以要求有这样一个队列:a1,a1,a3,a2,a2,[快照,a1,a2,a3],a3,a1。。。问题在于,这些项的类型不同:一种用于a1、a2等对象,另一种用于快照。这意味着它们应该在不同的队列中处理,但在这种情况下存在竞争条件:使用者可能会在处理快照之前处理对象


有什么模式可以解决这个(相当普遍的)问题吗?我们使用RabbitMQ进行消息排队。

每个消费者使用一个队列和一个内容类型前缀来指示要传递的消息的类型。在我看来,AMQP消息中可能有一个“type”属性,但我从未使用过它,所以我不知道它是否适用于这个问题。

也许可以将它们封装在一个公共类的对象中,例如QueueItem,它解决了“不同类型”的问题。一旦消费者将QueueItem从队列中取出,他们就可以简单地检查它包含什么类型的对象。但这是一个通用的解决方案,因为我对RabbitMQ一无所知,所以我将把它作为一个注释。