首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理像这个Java“实例过滤”[RabbitMQ]这样的消息的最Pythonic的方法是什么?

处理像这个Java“实例过滤”[RabbitMQ]这样的消息的最Pythonic的方法是什么?
EN

Stack Overflow用户
提问于 2020-04-23 14:52:36
回答 1查看 219关注 0票数 7

从Java背景开始,在开发通过JMS连接的服务时,我通常通过检查消息的类型来处理和区分它们,例如(简化):

代码语言:javascript
运行
复制
  Object object = myQueue.consume();
   if (object instanceof MessageA) {
      processMessageA((MessageA) object)
   } else if (object instanceof MessageB) {
      processMessageB((MessageB) object)
   }...

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

我几乎什么都有,但我仍在努力处理(消费)信息。如何区分消息类型?

我想要有自定义的JSON头,但我不知道这是否正确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-20 18:11:13

在用python进行编程时,特别是对于来自OO语言的人来说,记住两个原则是很重要的。

首先,Python不是OO语言,它只支持类和对象。最重要的是不依赖键入和\或类的方式。

第二,是最重要的“Python的禅”。这组想法决定了Python语言本身的大部分构建方式,同时也为我们中使用Python语言编程的人提供了帮助。在这些想法中,有两个你应该一直努力去实现。

  • 外显好于内隐。
  • 简单胜于复杂。

使用这些想法,我将尝试展示我认为最好的方法,即使用JSON报头的方式。明确意味着我们应该清楚地说明我们想要做什么,而简单意味着我们应该把它写在最符合逻辑的地方。我认为这直接指向JSON本身中的类型是实现这一想法的最显着和最简单的方式。此外,我假设您的消息类型之间存在差异,而不在标头中声明类型将要求您编写一些代码,以便根据一些模糊的差异来区分它们,这同样违背了显式性的概念。

结束时,您应该记住python中的任何内容都是一个对象,包括函数,这意味着您可以使用一个映射作为操作字典:

代码语言:javascript
运行
复制
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)

这使您可以在一个位置显式地指定所有代码路径(也称为策略模式)。它还有一个额外的好处,就是您永远不必更改实际的处理代码。

总之,我认为使用消息头确实是区分消息的最重要的方式,因为它比任何其他方式都更简单和更明确。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61390177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档