【发布时间】:2021-11-16 20:02:40
【问题描述】:
我正在使用 .NET Core 编写一个 Worker Service (Worker Services in .NET),它将连接到 IBM MQ 队列以读取它的消息。这将在一个长时间运行的进程中连续完成(进程将一直运行直到服务停止)。
我的问题是:在使用 IBM MQ 运行长进程时,推荐使用哪种连接策略?
我看到了三种选择:
- 整个应用程序生命周期中的一个连接在应用程序启动时打开连接一次。继续阅读 队列。应用程序停止时关闭连接。如果 连接意外停止,请使用适当的自动连接标志 自动重新连接到队列(如果可能)。
- 每次从队列中读取都打开一个新连接 每次我们需要从队列中读取时,打开一个到队列和队列管理器的新连接并读取一条消息。读取完成后关闭两个连接。
- 打开一个新连接并处理队列中的项目直到空当我们要处理消息时打开一个连接。处理队列中的所有消息,直到处理完所有消息。处理完所有消息后,关闭连接。
备选方案二似乎不是一种选择。但是对于队列和队列管理器,在这种情况下推荐的连接过程是什么?
【问题讨论】:
-
连接到队列管理器并打开队列一次并处理消息,直到应用程序被要求停止。在停止应用程序时关闭队列和连接。我还建议使用自动客户端重新连接,以便底层 MQ .NET 库在连接中断错误的情况下重新连接到队列管理器。
-
建议将选项 3 用于触发的应用程序。如果您有很长的间隔且没有要处理的消息,则建议使用触发的应用程序。这意味着应用程序在没有工作时停止,然后在消息到达时自动启动。对于非触发、始终运行的应用程序,建议使用选项 1。
-
一位聪明的客户告诉我的。有长时间运行的连接如果在随机 45-90 分钟内没有收到任何消息,则断开连接。这样做的好处是连接已关闭(可能在一夜之间),这意味着您没有数千个连接什么都不做,这也意味着您的连接必须每天至少重新验证一次,并且您没有使用过期密码运行的会话或证书很长。如果您使用的是旧版本的 MQ 和客户端,则可以将其连接到不同的队列管理器,并进行负载平衡(在您的控制之下)。
标签: ibm-mq