【问题标题】:Which of these MQ Consumer Designs is better?这些 MQ 消费者设计中哪一个更好?
【发布时间】:2015-08-20 08:07:16
【问题描述】:

情况

在我的例子中,有一个 MQ 服务器用于排队作业。作业完成后,需要将作业结果写入数据库。我将需要编写一个或多个程序来使作业出队、处理作业并将作业结果写入数据库。我脑子里有一些设计,但我不确定我应该选择哪一个,也不确定这些设计的优缺点。

虽然有一些要求,但程序应尽量确保:

  • 在服务器时不重复处理作业(假设作业正在发送电子邮件,您不希望客户收到 2 封相同内容的电子邮件)
  • 作业结果不丢失(以便您通过查询数据库知道作业结果)。

在我的情况下,性能并不是很重要,因为处理一项工作可能至少需要 10 秒。但是,我仍然想要一个好的设计,以便以后在考虑性能时可以重复使用它。

设计 1

将创建多个线程并单独工作。每个线程将从 MQ 服务器中取出一个作业,处理该作业并将作业结果写入数据库。之后,线程再次循环出列作业。

与 MQ 服务器的会话数和与数据库服务器的连接数将与线程数相同。如果性能是一个问题,这应该是一个问题。

设计 2

创建一个调度程序线程以从 MQ 服务器出列作业并调度到工作线程池。每个工作线程单独工作以处理作业并将作业结果写入数据库。

设计 3

创建一个调度程序线程以从 MQ 服务器出列作业并调度到工作线程池。每个工作线程单独工作以处理作业。作业完成后,工作线程会将作业结果传递到 MQ 服务器中的另一个队列。另一个数据库线程将从 MQ 服务器中取出作业结果并将结果写入数据库。

这种设计可以在数据库服务器宕机时提供帮助,这样程序仍然能够处理作业而不会丢失作业结果。

设计 4

将创建多个线程并单独工作。每个线程将从 MQ 服务器中取出一个作业并处理该作业。作业完成后,工作线程会将作业结果传递到 MQ 服务器中的另一个队列。多个数据库线程将作业结果从 MQ 服务器中取出,并将结果写入数据库。

在我看来,这似乎是最好的设计,它避免了调度程序的复杂设计,并且能够在数据库服务器关闭时利用排队作业结果。

其他设计

还有更多可以想到的设计。它们与上述 3 种设计类似,但仅适用于将作业结果写入数据库部分。所以我就不一一列举了。

备注

这是我第一次做 MQ 服务器项目。

【问题讨论】:

    标签: multithreading message-queue mq


    【解决方案1】:

    我认为您需要阅读 IBM MQ(又名 WebSphere MQ)。 MQ 不处理“作业”——它处理消息。 MQ 是“一次且仅一次”的消息传递,并且它已确保传递(对于持久消息)。

    设计#2 和 3 是一个非常糟糕的主意。您正在解耦进程,如果调度程序或工作线程崩溃(发生这种情况),则消息将丢失。当然,应用程序支持团队会责怪 MQ,因为他们不能责怪自己创建了一个糟糕的系统。

    只要您使用两阶段提交(阅读 MQ ETC),设计#1 就很好。

    如果您的数据库出现中断,请使用设计#4。 MQ 线程使用单阶段提交,数据库线程使用两阶段提交。

    【讨论】:

    • 你是对的。 MQ 是处理“消息”而不是作业的“消息”队列。看起来 MQ ETC 是特定于 WebSphere MQ 的。无论如何感谢您的建议:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多