【发布时间】:2016-08-30 18:02:51
【问题描述】:
我应该使用什么作为文档键来保持幂等性?
我正在构建一个文本消息应用程序,它使用 CouchDB(客户端上带有 PouchDB)在本地存储消息。 Twilio(SMS 提供者)为每条消息生成一个 ID,我将其用作 CouchDB 文档 ID。这种从 Twilio 的 API 获取消息的方式是幂等的——如果我遇到相同的消息两次,它只会在我的数据库中存储一个副本。
// 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 ID,因为它还没有被发送到 twilio。
传统方法包括POST将消息发送到我的服务器上的某个端点,然后让服务器将其发送到 twilio,然后在它获得来自 twilio 响应的 smsid 后将记录添加到数据库中。这样做的问题是 (a) 从用户按下“发送”到消息显示在 UI 中存在明显的延迟,并且 (b) 我们无法利用 couchdb 的身份验证系统。
相反,我设置了它,以便客户端生成一个随机 ID,并将其插入数据库(通过 pouchdb w/sync)。然后,服务器监视添加的新出站记录并将它们分派给 twilio。
这种方法效果很好,但是如果我再次GET /messages,它就不再是幂等的了——它会为出站消息创建一个额外的记录,因为我没有以该消息的smsid 作为其键的 couchdb 文档(添加到 couchdb 时没有smsid)。
有没有办法解决这个问题或更好的方法?
【问题讨论】:
-
除了
smsid和body,您还从Twilio 的/messages获得了哪些其他数据? -
我想不出一个简单的解决方案,除非你实现分布式事务。
标签: javascript couchdb twilio