以下MQ消费者设计中的哪一个更好



情况

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

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

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

在我的情况下,性能不太重要,因为处理一个作业可能至少需要10秒。然而,我仍然想要一个好的设计,以便以后在性能问题上可以重用它。

设计1

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

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

设计2

创建一个调度程序线程,将MQ服务器中的作业排成队列,并将其调度到工作线程池。每个工作线程分别处理作业并将作业结果写入数据库。

设计3

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

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

设计4

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

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

其他设计

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

备注

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

我认为您需要了解IBM MQ(也称为WebSphere MQ(。MQ不处理"作业",而是处理消息。MQ是"一次且仅一次"的消息传递,并且它有保证的传递(对于持久消息(。

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

只要您使用两阶段提交(阅读有关MQETC的内容(,设计#1就很好。

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

相关内容

  • 没有找到相关文章

最新更新