gpt4 book ai didi

负载平衡 Web 应用程序中的 Java 工作线程

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:54 25 4
gpt4 key购买 nike

我有一个网络应用程序,可以发送有关特定操作的电子邮件。因此,为此,它将请求保存在数据库中,然后一个电子邮件工作线程接收请求并发送电子邮件。电子邮件工作人员监视数据库的更改。

现在我想让相同的 Web 应用程序在共享相同数据库的负载均衡器后面运行。现在的问题是,当我在数据库中创建电子邮件请求时,负载均衡器后面不同计算机上的类似 Web 应用程序中运行的电子邮件工作人员可能会同时看到电子邮件的数据库条目,这将导致同一电子邮件被发送多次。

那么,除了显式锁定表之外,还有什么方法可以防止这种情况吗?

我读过这个问题Distributing java threads over multiple servers?但不知道那里提供的解决方案是否能满足我的需要。 Terracotta 似乎是解决方案,但我认为它需要将显式同步添加到代码中,不知道。

任何这方面的知识都会有所帮助。

最佳答案

一个简单、技术含量低的解决方案是让电子邮件发送工作程序仅运行一次。

这可以通过将工作程序提取到单独的应用程序(例如由 cron 触发)或通过使其可配置(无论您的 Web 应用程序实例是否激活了电子邮件工作程序)来实现。在后一种情况下,您需要确保只有一个负载平衡实例的电子邮件工作线程处于 Activity 状态

缺点是电子邮件发送不会是多余的,即如果正在发送电子邮件的主机关闭,则没有人发送任何电子邮件。

如果您需要冗余,则必须依赖一些分布式中间件,如上面链接的问题所示,或者自己实现同步机制。

对于自己的实现,您可以查看在电子邮件请求上使用版本号字段/列的乐观锁定,如 Hibernate/JPA 支持的那样(请参阅 https://stackoverflow.com/a/19456821/981913 )。该算法将类似于以下内容:

  1. Worker 醒来,在数据库中发现电子邮件请求,且版本列 = 0
  2. Worker 使用 version = 1 更新请求。仅当版本之前为 0 时更新才会成功,这意味着没有其他 Worker 将其更新为 1因为请求已在第 1 步中读取。
  3. 如果第 2 步的更新成功,工作人员可以放心地假设没有其他工作人员会处理此请求,然后继续发送电子邮件

关于负载平衡 Web 应用程序中的 Java 工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48746140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com