两个进程驻留在不同的AP服务器中,并引用相同的布尔标志。 (Spring,Java)

问题描述:

我正在使用Spring Framework开发Web应用程序。我有两个服务将存储一些处理结果到数据库中的一个表T中。逻辑目前是:两个进程驻留在不同的AP服务器中,并引用相同的布尔标志。 (Spring,Java)

服务A

for all items: 
    result = func(item) 
    store result to Table T (with status = new) 
is_running = False 

服务B

for some items: 
    if is_running == False: 
     result = func(item) 
     store result to Table T (with status = new) 
    else: 
     store result to Table T (with status = inprogress) 

布尔标志is_running将在服务A.

由于我们有一个字段用于域服务器,服务A和服务B的MicroService Architechture可以驻留在不同的AP服务器中。如何确保服务A和服务B参考相同的is_running

是否可以使用Spring's bean scope来实现?

Sprin是注入框架,本身并没有这样的功能。

我想重新写你的问题如下:如何实现跨机器布尔标志?

有很多方法可以做到这一点。最直接的方法是: 1.通过数据库。您可以创建带单列和单行的表格,您将在其中存储标志。你甚至可以在访问表之前锁定表格,以保证进程间的通信。 2.使用提供此类功能的其他工具。例如,我会推荐你​​Haselcast。这是一个Java网格,其他功能中包含原子变量,它们在不同的进程和机器之间共享状态。顺便说一句,他们也有春天融合。

简短的回答,不,Spring,只是一个编程框架。它没有做任何Java本身不会做的事情。跨进程交流就是这样一个事情。正如所建议的那样,您可以将该is_running标志存储在某个共享数据库中,并让这两个服务在运行其逻辑之前访问它。仍然有竞争条件,你需要考虑你的应用程序的胃口。
但是,逻辑可能不仅仅是那么简单,您甚至不会检查使用给定状态存储的结果。必须有一些业务逻辑,这将使您可以利用同步逻辑来实施。提到的当前逻辑将始终取决于is_running标志的时间点值。看起来不太对。

因为我们讲的是微服务,你是不允许在它们之间共享一个数据库。一个微服务不应该依赖/了解/关心对方的技术堆栈。状态由每个微服务所拥有,否则它不应该被认可,而是通过一个微服务API。

这就是说你需要一种技术不可知的方式来共享两个微服务之间的布尔标志。您可以同步或异步更新标志,这取决于系统的弹性要求。您可以使用REST和JSON来隐藏技术堆栈。

如果共享数据库,您将失去微服务体系结构的主要优点。

对于微服务架构,全局状态为

为了解决您的问题,服务A和B都应该在其自己的数据库中拥有自己的状态(is_running),该数据库与其他任何服务共享的不是

然后通过一个简单的API /serviceA/state/serviceB/state公开这个状态。这些端点应该返回状态(通过JSON)。

然后每个服务应该调用其他服务的API来检查其他服务的状态。