这些 MQ 消费者设计中哪个更好?

Which of these MQ Consumer Designs is better?

情况

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

尽管有一些要求,程序应尽量确保:

在我的案例中,性能不是很重要,因为处理一项作业可能至少需要 10 秒。但是我仍然想要一个好的设计,以便以后在关注性能时可以重用它。

设计 1

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

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

设计 2

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

设计 3

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

如果数据库服务器出现故障,此设计可以提供帮助,使程序仍然能够处理作业而不会丢失作业结果。

设计 4

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

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

其他设计

能想到的设计还有一些。它们与上述 3 种设计类似,但仅适用于将作业结果写入数据库部分。所以我不会再列出来了。

备注

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

我认为您需要阅读 IBM MQ(也称为 WebSphere MQ)。 MQ 不处理 'jobs' - 它处理消息。 MQ 是 'once and only once' 消息传递,它有保证传递(对于持久消息)。

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

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

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