【问题标题】:What is the most Pythonic way of processing messages like this Java "instance-filtering" [RabbitMQ]像这样 Java“实例过滤”[RabbitMQ] 处理消息的最 Pythonic 方式是什么
【发布时间】:2020-04-23 14:52:36
【问题描述】:

来自 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】:

    在使用 python 编程时,尤其是对于来自 OO 语言的人来说,牢记两个原则很重要。

    首先,Python 不是一种面向对象的语言,它只支持 类和对象。最 Pythonic 的方式通常是一种不依赖于类型和\或类的方式。

    其次,还有最重要的"Zen of 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 模式)。它还有一个额外的好处,就是您永远不必更改实际的处理代码。

    简而言之,我相信使用消息头确实是区分消息的最 Pythonic 方式,因为它比任何其他方式都更简单、更明确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      相关资源
      最近更新 更多