跨多个微服务的数据一致性,这些微服务重复数据

时间:2019-03-26 11:21:13

标签: database transactions microservices data-consistency

我目前正在尝试进入微服务架构,并且遇到了数据一致性问题。我读过,在几个微服务之间复制数据被认为是一个好主意,因为它使每个服务更加独立。

但是,在以下情况下,我无法弄清楚该怎么做才能保持一致性:

  1. 我有一个具有RegisterCustomer方法的客户服务。
  2. 注册客户时,我想通过RabbitMQ发送消息,以便其他服务可以提取此信息并将其存储在其数据库中。

我的代码如下所示:

             ...
            _dbContext.Add(customer);
            CustomerRegistered e = Mapper.Map<CustomerRegistered>(customer);
            await _messagePublisher.PublishMessageAsync(e.MessageType, e, "");
            //!!app crashes
            _dbContext.SaveChanges();
            ...

所以我想知道,当应用程序发送消息但自身无法保存数据时,该如何处理?当然,我可以交换 DbContextSave PublishMessage 方法,但是麻烦仍然存在。我的数据存储方法有问题吗?

2 个答案:

答案 0 :(得分:0)

是的。您正在执行双重持久性-数据库中的持久性和持久队列。如果一个人成功而其他人失败,那么您总是会遇到麻烦。有几种方法可以解决此问题:

  1. 坚持在数据库中,然后执行更改数据捕获(CDC),以便使用实时流将来自数据库预写日志(WAL)中的数据用于在第二个服务数据库中创建实例化视图

  2. 持续存在于持久队列和缓存中。使用实时流传输将数据保留在两个服务中。如果高速缓存中有数据,则从高速缓存中读取数据,否则从数据库中读取。这将允许写入后读取。即使在最坏的情况下写入缓存失败,数据也将在几秒钟内通过流传输存储在DB中。

答案 1 :(得分:0)

在与RMQ相比的许多情况下,NServiceBus确实支持持久distributed transaction。也许您可以考虑使用该功能来确保在失败的情况下将两个上下文保存或回滚,如果可以使用NServiceBus而不是RMQ。