像这样的Java "实例过滤"[RabbitMQ]处理消息的最Pythonic方式是什么?

问题描述 投票:0回答:1

从Java背景出发,在开发由JMS连接的服务时,我曾经处理消息并通过检查它们的类型来区分它们,例如(简化)。

  Object object = myQueue.consume();
   if (object instanceof MessageA) {
      processMessageA((MessageA) object)
   } else if (object instanceof MessageB) {
      processMessageB((MessageB) object)
   }...

所以现在我正在为RabbitMQ中的一些Python模块(主题通信)构建一个消息传递前端。我计划使用 一个队列 的每个消费模块的 不同的信息 会到达。

我几乎拥有了所有的东西,但我仍然在为处理(消耗)消息而苦恼。你会如何区分消息类型?

我想过用自定义JSON头,但我不知道这是否正确。

java python rabbitmq jms amqp
1个回答
5
投票

在用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方式,因为它比任何其他方式更简单、更明确。

© www.soinside.com 2019 - 2024. All rights reserved.