微服务架构中的数据原子插入+ NoSql数据库[微服务架构中的数据一致性]

时间:2017-06-27 13:12:50

标签: database-design cassandra architecture microservices nosql

我有3项服务A,B,C。

服务A接收来自客户端的请求。然后A为自己的数据库,服务B和C准备数据。基本上A是协调员。

  1. 在其数据库中插入数据
  2. 如果成功

    1. 将请求B的数据发布到服务B和B在其数据库中插入数据
    2. 如果成功

      1. 然后将请求C的数据发布到服务C和C在其数据库中插入数据
      2. 如果任何步骤失败,我们必须还原所有插入的数据。

        我使用的是Cassandra NoSQL DB。

        现在我需要针对所有可能发生的情况的通用解决方案:

        • 假设C正在插入数据(正在进行中),同时,A数据库上的某些读取查询R读取插入的数据。几毫秒之后,C无法插入,但R已经读取了很快就会被恢复的错误数据。

        在这种情况下该怎么办? - >改变数据库设计,这样的情况永远不会发生?

        • II。

          如果服务C数据插入失败,服务B有应用程序服务器停机因此无法恢复,该怎么办?

2 个答案:

答案 0 :(得分:0)

您可以使用批量查询。 yaml文件中有一个参数用于配置批处理大小。 batch_size_fail_threshold_in_kb:默认为50。

答案 1 :(得分:0)

如果您的服务完全独立,那么使用cassandra时会遇到困难。您要求使用自己的数据存储围绕这三种服务进行交易。

Cassandra本身仅支持轻量级交易 - 请参阅http://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlLtwtTransactions.html

您可以去实施自己的两阶段提交: https://en.wikipedia.org/wiki/Two-phase_commit_protocol https://en.wikipedia.org/wiki/Paxos_(computer_science)