Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
使用RabbitMQ和Python的基于内容的路由_Python_Routing_Rabbitmq_Amqp - Fatal编程技术网

使用RabbitMQ和Python的基于内容的路由

使用RabbitMQ和Python的基于内容的路由,python,routing,rabbitmq,amqp,Python,Routing,Rabbitmq,Amqp,RabbitMQ和Python是否可以执行基于内容的路由 AMQP标准和RabbitMQ声称支持基于内容的路由,但是否有Python库支持指定基于内容的绑定等 我目前使用的库(py-amqplib)似乎只支持基于主题的路由和简单的模式匹配(#,*)。答案是“是”,但还有更多…) 让我们首先就基于内容的路由的含义达成一致。有两种可能的含义。有人说它是基于消息的头部分。其他人说它是基于消息的数据部分 如果我们采用第一个定义,这些或多或少是我们做出的假设: 数据在某处存在,并通过某个软件发送到AMQP

RabbitMQ和Python是否可以执行基于内容的路由

AMQP标准和RabbitMQ声称支持基于内容的路由,但是否有Python库支持指定基于内容的绑定等

我目前使用的库(py-amqplib)似乎只支持基于主题的路由和简单的模式匹配(#,*)。

答案是“是”,但还有更多…)

让我们首先就基于内容的路由的含义达成一致。有两种可能的含义。有人说它是基于消息的头部分。其他人说它是基于消息的数据部分

如果我们采用第一个定义,这些或多或少是我们做出的假设: 数据在某处存在,并通过某个软件发送到AMQP代理。我们假设这段软件对数据有足够的了解,可以将键值(KV)对放在描述内容的消息头中。理想情况下,发送者也是数据的生产者,因此它拥有我们想要的尽可能多的信息。假设数据是一个图像。然后,我们可以让发送方将KV对放在消息头中,如下所示:

width=1024
height=768
mode=bw
photographer=John Doe
现在,我们可以通过创建适当的队列来实现基于内容的路由。假设我们有一个单独的操作来执行黑白图像,还有一个单独的操作来执行彩色图像。我们可以创建两个队列,一个接收带有
mode=bw
的消息,另一个接收带有
mode=color
的消息。然后我们有独立的客户机监听这些队列。代理执行路由,而我们的客户机中没有任何东西需要知道路由

如果我们采用第二种定义,我们会从不同的假设出发。我们假设数据存在于某个地方,并通过某个软件发送给AMQP代理。但我们认为,要求软件在报头中填充KV对是不明智的。相反,我们希望根据数据本身做出路由决策

在AMQP中有两种选择:您可以决定为您的特定数据格式实现新的交换,或者您可以将路由委托给客户机

在RabbitMQ中,有直接(1-to-1)、扇出(1-to-N)、头(头过滤1-to-N)和主题(主题过滤1-to-N)交换,但您可以根据AMQP标准实现自己的交换。这需要阅读大量RabbitMQ文档并在Erlang中实现exchange

另一个选项是用Python创建一个AMQP客户机,它侦听一个特殊的“内容路由队列”。每当消息到达队列时,您的路由器客户机就会将其拾取,执行任何需要的操作来做出路由决策,并将消息发送回代理到合适的队列。因此,为了实现上述场景,Python程序将检测图像是黑白图像还是彩色图像,并(重新)将其发送到“黑白”或“彩色”队列,由合适的客户端接管

因此,关于第二个问题,在客户机中没有任何基于内容的绑定。您的客户机可以如上所述工作,或者您可以在RabbitMQ本身中创建一个新的exchange类型。然后,在客户端设置代码中,将exchange类型定义为新类型


希望这能回答你的问题

在RabbitMQ中,路由是exchange决定将消息放在哪些队列上的过程。您可以将所有邮件发布到exchange,但只接收来自队列的邮件。这意味着交换是进程的一个活动部分,它对消息转发或复制做出一些决定

RabbitMQ中包含的主题交换查看传入消息(路由_键)上的字符串,并将其与所有队列提供的模式(绑定_键)相匹配,这些队列声明希望从交换接收消息

RabbitMQ源代码位于web上,因此您可以在此处查看主题“交换代码”: 处理称为trie的数据结构非常复杂,它允许非常快速的查找。事实上,互联网路由器内部也使用相同的数据结构

在此处找到交换头 可能更容易理解。正如您所看到的,进行不同类型的交换不需要太多代码。如果您想检查内容(或者只看消息的前几个字节),您应该能够快速识别XML与JSON以及其他内容。如果您的JSON对象和XML文档保持特定的元素序列,那么您应该能够区分不同的JSON对象(或XML文档类型)不解析整个消息体