从Java背景出发,在开发由JMS连接的服务时,我曾经处理消息并通过检查它们的类型来区分它们,例如(简化)。
Object object = myQueue.consume();
if (object instanceof MessageA) {
processMessageA((MessageA) object)
} else if (object instanceof MessageB) {
processMessageB((MessageB) object)
}...
所以现在我正在为RabbitMQ中的一些Python模块(主题通信)构建一个消息传递前端。我计划使用 一个队列 的每个消费模块的 不同的信息 会到达。
我几乎拥有了所有的东西,但我仍然在为处理(消耗)消息而苦恼。你会如何区分消息类型?
我想过用自定义JSON头,但我不知道这是否正确。
在用python编程时,特别是对于OO语言出身的人来说,要记住两个原则。
第一,Python并不是OO语言,它只是 支持 类和对象。最pythonic的方式通常是不依赖类型和类的方式。
其次,还有一个最重要的是 "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)
这允许你在一个地方明确指定所有的代码路径 (这也被称为 "操作字典") 攻略 模式)。) 它还有一个额外的好处,那就是你永远不必改变实际的处理代码。
简而言之,我相信使用消息头确实是区分消息的最pythonic方式,因为它比任何其他方式更简单、更明确。