【问题标题】:How to make IBM MQ listener process slowly using spring java application如何使用 Spring Java 应用程序使 IBM MQ 侦听器进程缓慢
【发布时间】:2019-11-23 03:16:50
【问题描述】:

我们正在尝试将旧系统迁移到微服务 在 Paas 环境中,我们有调度程序作业来触发并将消息一一放入 MQ,我们在微服务中有 MQ 侦听器来获取消息并创建请求并将请求发送到外部方。

问题来了,我们的微服务可以对外部服务进行异步调用,但是我们的外部服务无法处理异步调用,所以它返回了错误的数据。 例如,我们使用每分钟 40 到 60 个请求的外部服务,而外部服务每分钟只能处理 6 个请求。

那么如何才能让 MQ 监听器处理缓慢。

我尝试将setMaxConcurrenceConsumer 减少到 1 和 使用observable.toblocking.single() 使进程只在一个线程中运行。

我们在微服务中使用 RxJava。

【问题讨论】:

  • 根据描述,请求不应该在外部队列管理器中排队吗?为什么这会导致它返回错误的数据?
  • Mq 只提供正确的数据,但外部服务无法处理异步进程,因此它提供了错误的数据
  • 你可能想看看从微服务对你的外部服务进行同步调用的可能性。这样,您对外部服务的调用就会按顺序排列。最好请外部服务的所有者调查并解决问题。
  • 感谢@Shashi,我们尝试进行同步调用,但由于事件仅由MQ触发而失败,然后我们也尝试一次只允许一个线程,但仍然如此之快。

标签: java spring jms rx-java ibm-mq


【解决方案1】:

听起来您的微服务或外部服务没有遵循请求-回复消息传递的用例。

(1) 外部服务是否将回复的消息关联 ID 设置为请求消息的消息 ID?

(2) 您的微服务是否使用通过关联 ID 获取的匹配选项执行 MQGET。

您可以将错误归咎于外部服务,但如果您的微服务实际上收到了错误消息,那么这是您的应用程序的错误。即,您的微服务是否只是简单地获取队列中的“下一条”消息?

阅读此答案:How to match MQ Server reply messages to the correct request

这是一个解释(看起来像是 90 年代但有很好的信息):https://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReplyJmsExample.html

【讨论】:

    【解决方案2】:

    从长远来看,我们也计划将外部服务迁移到。

    在短时间内,我使用 observable.toblocking.single()、thread.sleep() 和 setMaxConcurrenceConsumer() 将其修复为 1,因此一次只能运行一个线程。这将避免对外部服务的异步调用。睡眠时间将动态设置,并对外部服务进行一些分析。

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 1970-01-01
      • 2018-01-19
      • 2010-12-04
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多