哪些MQ消费者设计更好?

时间:2015-08-20 08:07:17

标签: multithreading message-queue mq

场合

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

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

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

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

设计1

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

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

设计2

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

设计3

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

如果数据库服务器关闭,此设计可以提供帮助,这样程序仍然可以处理作业而不会丢失作业结果。

设计4

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

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

其他设计

还有一些设计可以想到。它们类似于上述3种设计,但仅适用于将作业结果写入数据库部分。因此我不打算再次列出。

备注

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

1 个答案:

答案 0 :(得分:1)

我认为您需要阅读IBM MQ(也称为WebSphere MQ)。 MQ不处理'工作' - 它处理消息。 MQ只有一次,只有一次'传递信息并确保传递(用于持久信息)。

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

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

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