【问题标题】:quartz spring design suggestion石英弹簧设计建议
【发布时间】:2016-12-26 12:40:06
【问题描述】:

我很少有在集群环境中使用石英 + 弹簧运行的作业。这些作业未设置为在集群环境中运行,因此每个作业将根据我们拥有的实例数量运行多次。这些作业在 AWS 环境中运行。所以我们不确定有多少实例会运行,因为我们可以动态增加或减少。所以我们正在重构代码。

问题,让我们以基于特定活动向用户发送电子邮件的工作为例。每天可能有 1000 个用户需要我们发送电子邮件。

目前,由于未设置为在集群环境中运行,因此每个实例都会运行作业并向用户发送有关其活动的电子邮件。所以如果我有 3 个实例正在运行,作业将运行 3 次,相同的电子邮件将发送给用户 3 次。

我们决定使用石英 jdbc 来确保作业只运行 1 次。

我正在寻找有关如何执行以下部分的建议。

让我说我必须向 300 个用户发送电子邮件,而不是在 1 个实例上运行的工作选择用户并将电子邮件发送给 300 个用户,我希望在任何实例上的工作从数据库中获取 300 个用户,然后在其他实例上获取相同的工作实例也参与处理这 300 个用户。最好的方法是什么。我不想将这 300 个用户存储在临时表中并从数据库中挑选用户。有没有一种方法可以将这 300 个用户存储在全局内存中,例如 memcached,并在不同的实例上从那里提取数据(处理用户时的负载平衡)。我不想使用 memcache,所以任何其他可用的选项或我可以继续设计的最佳方式。

【问题讨论】:

  • 是您的应用程序在数据库中插入记录吗?还是您的应用程序只从数据库中提取记录并发送电子邮件?
  • 这个应用会获取使用rest服务的用户列表,并为每个用户调用其他rest服务发送邮件

标签: spring quartz-scheduler


【解决方案1】:

几个月前,我们遇到了同样的问题。我们解决了这个问题,创建了一个名为 job 的表,如下所示,只是为了控制正在运行的调度程序。

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| createdAt | datetime     | NO   |     | NULL    |                |
| updatedAt | datetime     | NO   |     | NULL    |                |
| version   | int(11)      | YES  |     | NULL    |                |
| running   | tinyint(4)   | YES  |     | NULL    |                |
| scheduler | varchar(255) | YES  | UNI | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

基本上第一个实例在启动调度程序时将“运行”属性设置为 1(运行),当完成设置为 0(停止)。

这种方法的问题:

  • 每个调度程序都有相同的代码来验证表(冗余代码)。
  • 如果您忘记了这一组,调度程序将无法正常工作。

不是最好的解决方案,但可以姑息治疗。

【讨论】:

  • 感谢您的回复,但这确实对我没有帮助,因为我们计划使用石英 jdbc 支持,但我的问题主要是如何在处理我从我的用户列表中获得的用户列表时进行负载平衡第一份工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多