当前位置: 首页 > 知识库问答 >
问题:

微服务-多个服务副本之间的竞争条件

欧阳安阳
2023-03-14

我知道java中的关键字“synchronized”是用于多线程的。然而,副本不是多线程的,而是多进程的。我说的对吗?有什么想法吗?

共有1个答案

沈博达
2023-03-14

数据库将有一个类似product(id,amount)的表。下订单需要更新该产品的记录。

其实现如下所示。首先,应用程序将从DB读取产品数量:

SELECT id, amount
FROM Product
WHERE id = {some_id}
FOR UPDATE;

则应用程序代码将检查是否存在请求的金额。然后更新DB中的值:

UPDATE Product
SET amount = {new_amount}
WHERE id = {some_id}
    null
SELECT id, amount, version
FROM Product
WHERE id = {some_id}

应用程序中的检查工作方式与悲观场景中的检查工作方式相同。但最终的更新有所不同:

UPDATE Product
SET amount = {new_amount}
WHERE id = {some_id}
   and version = {version_we_read_initially}

更新操作总是返回更新的记录数。如果我们得到0,则表示在运行事务时该记录被更改了。这意味着我们最初(在第一个查询中)看到的数量可能已经改变了。为了继续,我们需要重试从步骤1开始的整个操作,即再次读取产品的金额和版本,检查是否有所需的金额,并尝试再次更新金额。

当然,我们要重试的次数应该有一定的限制。对于有需求的产品,在繁忙的系统中,这可能会成为一个问题。

 类似资料:
  • 我们有一个侦听事件的微服务,现在让我们调用这个。它侦听RabbitMQ上的审计事件()。任何想要调用的人都需要创建并激发。我们在一个公共模块中共享了pojo,因此可以共享它。 注意,最后一部分需要是同步的,这意味着如果数据库保存失败,我们不想发送电子邮件或类似的东西。目前,这是通过从中的事件处理程序中调用commandGateway来完成的,从调用commandGateway是否正确,如果不正确,

  • 我有两个微服务,例如A和B。微服务B有剩余的enpoint,必须只能从微服务A访问。如何限制微服务之间的访问?如果可能的话,最佳做法是什么? 我正在使用Spring Cloud Security(oAuth2, jwt)。

  • 我正在写一个微服务的应用程序,由Spring Boot和Spring云。我有五个模块 API网关(基于Spring云网关spect) Discovery-Server(基于Spring云NetflixEureka服务发现) Microservice-A(它是一个包含我们业务的Spring引导应用程序) Microservice-B(它是一个包含我们业务的Spring引导应用程序) Microser

  • 当前体系结构: 问题: 我们在前端和后端层之间有一个两步流程。 null 微服务2(MS2)需要验证I1的完整性,因为它来自前端。如何避免对MS1进行新的查询?最好的办法是什么? 我试图优化的流删除了步骤1.3和2.3 流程1: null 流程2: 2.1用户X已在本地/会话存储中存储了数据(MS2_Data) 2.2用户X在MS1上保留数据(MS2_Data+MS1_Data) 2.3 MS1使

  • 9.1. 竞争条件 在一个线性(就是说只有一个goroutine的)的程序中,程序的执行顺序只由程序的逻辑来决定。例如,我们有一段语句序列,第一个在第二个之前(废话),以此类推。在有两个或更多goroutine的程序中,每一个goroutine内的语句也是按照既定的顺序去执行的,但是一般情况下我们没法去知道分别位于两个goroutine的事件x和y的执行顺序,x是在y之前还是之后还是同时发生是没法