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