Spring 石英弹簧设计建议

Spring 石英弹簧设计建议,spring,quartz-scheduler,Spring,Quartz Scheduler,我很少有在集群环境中使用quartz+spring运行的作业。这些作业未设置为在集群环境中运行,因此每个作业将根据我们拥有的实例数运行多次。这些作业在AWS环境中运行。因此,我们不确定将运行多少实例,因为我们可以动态地增加或减少实例。因此,我们正在重构代码 问题,让我们举一个作业为例,它根据特定的活动向用户发送电子邮件。每天可能有1000个用户需要发送电子邮件 目前,由于未将其设置为在群集环境中运行,因此每个实例都会运行作业并向用户发送有关其活动的电子邮件。所以,若我有3个实例在运行,那个么作业

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

问题,让我们举一个作业为例,它根据特定的活动向用户发送电子邮件。每天可能有1000个用户需要发送电子邮件

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

我们决定使用quartz jdbc来确保作业只运行一次

我正在寻找如何做以下部分的建议


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

几个月前,我们遇到了同样的问题。我们修复了这个问题,创建了一个名为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    |                |
+-----------+--------------+------+-----+---------+----------------+
基本上,当启动调度器时,第一个实例将“running”属性设置为1(running),当finish设置为0(stop)

这种方法的问题:

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

这不是最好的解决办法,但姑息疗法有效。

几个月前,我们也遇到了同样的问题。我们修复了这个问题,创建了一个名为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    |                |
+-----------+--------------+------+-----+---------+----------------+
基本上,当启动调度器时,第一个实例将“running”属性设置为1(running),当finish设置为0(stop)

这种方法的问题:

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

这不是最好的解决方案,但有了缓和剂,它就可以工作。

是您的应用程序在数据库中插入记录吗?或者您的应用程序仅从数据库中拾取记录并发送电子邮件?此应用程序将获取使用rest服务的用户列表,并且每个用户都会调用其他rest服务发送电子邮件是您的应用程序在数据库中插入记录吗?或者您的应用程序仅从数据库中拾取记录并发送电子邮件?此应用程序将获取使用rest服务的用户列表,并且对于每个用户,都会调用其他rest服务发送电子邮件感谢您的响应,但这对我没有帮助,因为我们计划使用quartz jdbc支持,但我的问题主要是如何在处理我第一份工作中获得的用户列表时进行负载平衡。感谢您的回复,但是这对我没有帮助,因为我们计划使用quartz jdbc支持,但我的问题主要是如何在处理我第一份工作中获得的用户列表时进行负载平衡。