消息队列或调度程序

Posted

技术标签:

【中文标题】消息队列或调度程序【英文标题】:Message Queue or Scheduler 【发布时间】:2011-02-11 13:31:18 【问题描述】:

我目前正在使用 Quartz Scheduler 执行异步任务,例如在发生异常时发送电子邮件、从 Web 界面发送电子邮件或定期分析流量。

我应该使用消息队列来发送电子邮件吗?这样做是否更有效或更正确?调度程序方法工作得很好。

如果我使用队列并且电子邮件发送失败,队列是否可以稍后重试发送电子邮件?对于需要立即执行的任务,队列方法看起来比调度程序更简单,但对于调度程序任务,调度程序仍然存在,除非队列中的内容比我知道的要多。

我还没有使用过JMS,所以这是我阅读的内容。

沃尔特

【问题讨论】:

【参考方案1】:

队列是发送电子邮件之类的更自然的选择。 Quartz 可以硬塞进去,但当你重试之类的事情时,它就不是很合适了。调度程序最适合顾名思义——应该定期发生的任务。

【讨论】:

我不同意调度程序仅用于定期发生的任务的观点。在我看来,一次性使用它并没有错。如果你使用 Quartz 的持久性作业,它会在关机后继续工作并在集群中工作,并且你可以很容易地标记作业以在它失败时重新执行。见bit.ly/eiSkRS【参考方案2】:

它们确实不同,这取决于您发送电子邮件的目的和频率。 调度程序生成一个基于时间的事件,然后运行一些代码来发送电子邮件。 队列无法触发事件,它需要从某个地方放一条消息,然后 MessageListener 发送一封电子邮件。

要回答您的问题,队列是发送电子邮件的好工具

    消息需要重新打开 如果操作失败,则队列, 即使 SMTP 不知道是否 电子邮件已到达目的地。 某些触发器可以打开消息 队列。

调度器可以在一定的时间间隔运行一些java代码,从而产生时间事件。 如果您想定期发送电子邮件,那么调度程序就是您的最佳选择。

如果您使用调度程序,那么您应该让调度程序将消息放入队列中。 如果没有,那么您需要让其他触发器将消息放入队列。

【讨论】:

罗曼 - 听起来不错。我接受了您的评论,因为它更具描述性。我想我会排队去。如果邮件发送失败,我的失败模式是尝试其他类型的通知。 @Walter White 电子邮件不是保证交付系统。如果您必须发送此电子邮件,那么您有多种选择。 1) 将其发布在您的网站上并让此人登录并查看其帐户的任何更新。 2)在您的电子邮件中放置一个 URL,让他们在收到邮件时点击,如果没有定期发送。仍然不能保证,你只知道什么时候得到它。 3) 用电子邮件发送一封信(假设是银行的账户信息) 如果需要,可以注册该信函。 2) 我实际上发现使用像 Quartz 这样的调度程序非常适合这个;当使用持久化的时候,它们会在关闭时存活下来,并且内置了一个自然的重试机制。【参考方案3】:

我同意 Tom 的观点,这种异步通信最好通过队列完成。其工作方式类似于遵循观察者模式的发布-订阅者模型。

【讨论】:

以上是关于消息队列或调度程序的主要内容,如果未能解决你的问题,请参考以下文章

Android UI 线程消息队列调度顺序

消息队列之zookeeper

消息队列何时提供NodeJS的支持

消息队列MQ技术的介绍和原理

消息队列mq的原理及实现方法

消息队列MQ技术的介绍和原理