假设我有一个带有2个二级索引的“消息”表:
我想通过“recipient_id”对“消息”表进行分片。这样检索发送给某个收件人的所有邮件我只需要查询一个分片。
但与此同时,我希望能够进行查询,询问某个发件人发送的所有邮件。现在我不想将该查询发送到“message”表的每个分片。一种方法是复制数据并使用“sender_id”分片的“message_by_sender”表。
该方法的问题在于,每次发送消息时,我都需要将消息插入“message”和“message_by_sender”表中。
但是如果在插入“message”后插入“message_by_sender”会失败怎么办?在这种情况下,消息存在于“消息”中,但不存在于“message_by_sender”中。
如何确保“消息”中存在消息,那么它也存在于“message_by_sender”中而不诉诸2阶段提交?
对于任何分片数据库的人来说,这一定是一个非常常见的问题。你怎么处理它呢?
答案 0 :(得分:1)
这个问题没有“银弹”。一些选择:
您可能希望阅读此博客文章,了解如何在Google App Engine上执行分布式事务:http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine。基本上,如果您不想要2阶段提交或Paxos或类似的东西,那么您需要使用某种最终一致的模型。
-Dave