idempotencyを維持するためにドキュメントキーとして使用するものは何ですか?
メッセージをローカルに保存するためにCouchDB(クライアント上のPouchDB)を使用するテキストメッセージングアプリケーションを構築しています。 Twilio(SMSプロバイダ)は各メッセージのIDを生成し、それをCouchDBのドキュメントIDとして使用します。 TwilioのAPIからメッセージをフェッチすることは冪等であり、同じメッセージを2回出すと、データベースに1つのコピーしか保存されません。idempotencyを維持するためにドキュメントキーとして使用するものは何ですか?
// twilio API /messages
[
{smsid: 123, body: 'foo'},
{smsid: 456, body: 'bar'}
]
// transformed into couchdb docs
[
{id: 123, doc: {_id: 123, body: 'foo'}},
{id: 456, doc: {_id: 456, body: 'bar'}}
]
これは twilioからのメッセージを取得する際に行うのは簡単です。しかし、ユーザーがクライアントアプリケーションから送信メッセージを送信すると、まだtwilioに送信されていないため、まだtwilio IDはありません。
伝統的なアプローチでは、自分のサーバー上のあるエンドポイントにメッセージを送り、サーバーがtwilioに送信してからtwilioの応答からsmsid
を取得した後にそのレコードをデータベースに追加させます。この問題は、(a)ユーザが「送信」を押してからUIにメッセージが表示されたときに顕著な遅延があり、(b)couchdbの認証システムを利用できないことです。
代わりに、クライアントがランダムIDを生成し、それを(pouchdb w/syncを介して)データベースに挿入するように設定しました。サーバーは、追加された新しいアウトバウンドレコードを監視し、twilioにディスパッチします。
このアプローチはうまく動作しますが、私は再びGET /messages
場合、それはもはや冪等ません - 私はそのメッセージのsmsid
そのキーなどでCouchDBのドキュメントを持っていないので、それは、送信メッセージ用の追加レコードを作成します(それはdidnのそれがcouchdbに追加されたときにsmsid
があります)。
これ以上の方法がありますか?
Twilioの '/ messages'には' smsid'と 'body'の他にどのようなデータがありますか? – fiatjaf
分散トランザクションを実装しない限り、私はこれに対する単純な解決策は考えられません。 –