像Java“instancefiltering”[RabbitMQ]这样处理消息的最具Python风格的方式是什么

2024-05-14 21:52:53 发布

您现在位置:Python中文网/ 问答频道 /正文

从Java后台提交,在开发由JMS连接的服务时,我用来处理消息,并通过检查其类型来区分它们,例如(简化):

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

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

我几乎拥有一切,但我仍在努力处理(消费)消息。您如何区分消息类型

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


Tags: 模块消息类型ifobjectjava后台区分
1条回答
网友
1楼 · 发布于 2024-05-14 21:52:53

当用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)

这允许您有一个明确指定所有代码路径的位置(也称为Strategy模式)。它还有一个额外的好处,就是您不必更改实际的处理代码

简言之,我认为使用消息头确实是区分消息的最具python风格的方式,因为它比任何其他方式都更简单、更明确

相关问题 更多 >

    热门问题