1

说我有与2个二次索引的 “消息” 表:如何处理数据库分片中的非规范化/二级索引?

  • “recipient_id”
  • “SENDER_ID”

我想通过 “recipient_id” 到分片的 “消息” 表。这种方式来检索发送给某个收件人的所有邮件,我只需要查询一个分片。

但是与此同时,我希望能够进行查询,询问某个发件人发送的所有邮件。现在我不想将该查询发送到“消息”表的每个分片。一种方法是复制数据,并有一个由“sender_id”分隔的“message_by_sender”表。

该方法的问题是,每次发送消息时,都需要将消息插入“message”和“message_by_sender”表中。

但是如果插入“message”后插入到“message_by_sender”失败怎么办?在这种情况下,消息存在于“消息”中,但不存在于“message_by_sender”中。

如何确保如果消息存在于“消息”中,那么它也存在于“message_by_sender”中而不诉诸两阶段提交?

这对于任何分割数据库的人来说都是一个非常普遍的问题。你如何处理它?

回答

1

这个问题没有“银弹”。一些选项:

  1. 使用消息队列发布更改。最终,这些更改将使其适用于不同的分区。
  2. 在消息表分区上创建一个在表中创建“需要索引条目”行的触发器。别的东西会定期扫描并创建索引。

您可能想要阅读有关在Google App Engine上执行分布式交易的此博客条目:http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine。基本上,如果你不想要2阶段提交或Paxos或类似的东西,那么你需要生活在某种最终一致的模型中。

-Dave