我想Cassandra
不提供回滚功能。在我的场景中,需要将一条数据写入两个不同的数据库(User
和Address
)。
例如,说我要添加有关用户的信息。它有他们的名字,地址。我想将此信息分为两部分,以便我可以根据用户的电子邮件ID和所在的国家/地区查询用户。因此,我将创建两个数据库(每种查询类型一个),并将使用email id
和country
作为分区键。
我可能会遇到的问题是-(1)用户创建配置文件(带有所有与用户相关的信息的HTTP请求)(2)我向User
数据库发出Cassandra请求以在其中添加部分信息user
数据库(电子邮件,名称)(3)我再次发出Cassandra请求,将地址信息添加到Address
数据库。
现在,如果第3步失败,我需要回滚第2步。由于Cassandra没有这样做,所以我必须编写代码。但是不能保证我对步骤2的回滚将成功!
要处理这种情况,我认为逻辑应该在应用程序设计中,而不是代码中。您认为我应该如何设计应用程序?我的想法是
1)创建包含所有信息(分区键电子邮件ID)的Master
数据库。当用户请求进入时,仅填充此数据库。每行都有一个字段,用于指示该行中的数据是否已分发。如果在Master
中添加了数据,则用户将获得成功确认
2)另一个单独的过程负责获取行(标记为非分布式)并将其数据添加到两个数据库User
和Master
中。我可以在此过程中实现保持数据一致性的逻辑(例如,如果两个操作均成功,则首先在User
中添加数据,然后在Master
和distributed field in
Master gets set to
true中添加数据由于这是一个独立的后端过程,因此我可以根据需要进行多次尝试,而不必担心用户等待确认。
你怎么看?