Anu*_*nuj 1 java spring-boot microservices
我一直在对微服务进行一些研究,有一个没有得到很好解决的问题是一个微服务是否应该有多个实例,如果是,如何处理?
假设我有一个名为 filewatcher 的微服务,它从 FEED 文件夹中的某个共享驱动器中获取文件,并在表中创建一条记录并将有效负载消息发送到 kafka。
在这里,如果文件监视服务的多个实例在不同服务器(逻辑或物理服务器)上运行并从同一位置获取文件,则会创建重复记录。
在这里我已经从数据库端实现了验证。但我正在寻找一些架构解决方案。这就是为什么 filewatcher 服务从 FEED 文件夹读取重复文件的原因。
我认为 Spring Boot 中的 @Transactional 将解决事务问题。它没有解决重复文件上传问题。
如何处理这种情况?
高水平
我喜欢你的问题,希望我的 2 美分有帮助。您绝对可以同时运行多个微服务实例,但它们在逻辑上不应该是分开的。它们必须作为一个逻辑实例进行操作。因此,您尝试扩展的单个微服务应该构建为无状态的,其中所有微服务有状态数据都保存在共享数据库结构中。如果您打算运行多个实例,则不应在各个微服务实例上保留内部状态。
由于多种原因,您可能希望将单个微服务分布在多个实例上。
我想到了可靠性。为了获得 99.99999% 的黄金可用性,您需要运行多个微服务实例,以防一个实例崩溃。
可扩展性在这里也发挥着作用。通过运行多个微服务实例,您可以垂直扩展请求容量
在大数据系统中,可能需要将微服务共同部署在物理上距离较远的不同区域,以减少延迟。
数据库同步
因此,问题主要是:如何确保微服务实例在作用于共享数据时不会相互遍历?答案是必须同步数据库交互以及与外部系统的交互。
可以使用 Spring Boot 的 JDBC 库来同步微服务中的数据库交互。@Transactional在存储库查找上加锁的注释可PESSIMISTIC_WRITE用于确保只有一个微服务实例可以创建数据库表条目。要了解有关事务和传播方法的更多信息,请查看https://www.baeldung.com/spring-transactional-propagation-isolation。要了解有关锁定数据库的更多信息,请在此处阅读 JDBC 锁定: https: //www.baeldung.com/jpa-pessimistic-locking。总的来说,您需要考虑微服务实例之间同步的数据库层策略。
如果您需要在外部实体上运行同步作业,我推荐 Quartz-Scheduler,它可以使用数据库事务来同步作业。请务必使用@DisallowConcurrentExecution注释。请参阅http://www.quartz-scheduler.org/
领导人选举
可以创建领导者选举算法来同步微服务实例。在领导者选举中,一个微服务由共享算法“选举”来指导所有其他微服务实例。因此,领导实例可以指导从属实例执行关键区域任务。但是,如果选择此模式,您需要小心,不要让领导者实例成为系统的瓶颈。https://learn.microsoft.com/en-us/azure/architecture/patterns/leader-election
| 归档时间: |
|
| 查看次数: |
5015 次 |
| 最近记录: |