从Java背景开始,在开发通过JMS连接的服务时,我通常通过检查消息的类型来处理和区分它们,例如(简化):
Object object = myQueue.consume();
if (object instanceof MessageA) {
processMessageA((MessageA) object)
} else if (object instanceof MessageB) {
processMessageB((MessageB) object)
}...
因此,现在我正在为RabbitMQ (主题通信)中的一些Python模块构建消息传递前端。我计划对每个消费者模块使用,一个队列,,,不同的消息,将到达。
我几乎什么都有,但我仍在努力处理(消费)信息。如何区分消息类型?
我想要有自定义的JSON头,但我不知道这是否正确。
发布于 2020-05-20 18:11:13
在用python进行编程时,特别是对于来自OO语言的人来说,记住两个原则是很重要的。
首先,Python不是OO语言,它只支持类和对象。最重要的是不依赖键入和\或类的方式。
第二,是最重要的“Python的禅”。这组想法决定了Python语言本身的大部分构建方式,同时也为我们中使用Python语言编程的人提供了帮助。在这些想法中,有两个你应该一直努力去实现。
使用这些想法,我将尝试展示我认为最好的方法,即使用JSON报头的方式。明确意味着我们应该清楚地说明我们想要做什么,而简单意味着我们应该把它写在最符合逻辑的地方。我认为这直接指向JSON本身中的类型是实现这一想法的最显着和最简单的方式。此外,我假设您的消息类型之间存在差异,而不在标头中声明类型将要求您编写一些代码,以便根据一些模糊的差异来区分它们,这同样违背了显式性的概念。
结束时,您应该记住python中的任何内容都是一个对象,包括函数,这意味着您可以使用一个映射作为操作字典:
message_to_action_map = {
'typeA': functionA,
'typeB': functionB
}
def consumer_callback(msg):
# In Python, RabbitMQ works by push and not by pull
process = message_to_action_map[msg['type']]
process(msg)
这使您可以在一个位置显式地指定所有代码路径(也称为策略模式)。它还有一个额外的好处,就是您永远不必更改实际的处理代码。
总之,我认为使用消息头确实是区分消息的最重要的方式,因为它比任何其他方式都更简单和更明确。
https://stackoverflow.com/questions/61390177
复制相似问题