我应该使用什么作为维护幂等性的文件密钥?

时间:2016-08-23 00:35:29

标签: javascript couchdb twilio

我应该使用什么作为维护幂等性的文档密钥?

我正在构建一个文本消息传递应用程序,它使用CouchDB(在客户端上使用PouchDB)在本地存储消息。 Twilio(SMS提供程序)为每条消息生成一个ID,我将其用作CouchDB文档ID。这种方式从Twilio的API中获取消息是幂等的 - 如果我两次遇到相同的消息,它只会在我的数据库中存储一个副本。

var backgroundStyle: NSBackgroundStyle

从 twilio中获取消息时,这很容易。但是当用户从客户端应用程序发送出站消息时,还没有twilio ID,因为它还没有被发送到twilio。

传统的方法是将// 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的POST& #39;的回应。这个问题是(a)从用户按下"发送"时出现明显的延迟。当消息显示在用户界面中时,(b)我们无法利用couchdb的身份验证系统。

相反,我设置了它,所以客户端生成一个随机ID,并将其插入数据库(通过pouchdb w / sync)。然后服务器监视添加的新出站记录并将它们分派给twilio。

这种方法运行正常,但如果我再次smsid,它就不再是幂等的 - 它会为出站邮件创建一个额外的记录,因为我没有带有couchdb的文档该邮件的GET /messages为其关键字(当它被添加到couchdb时,它没有smsid。)

有没有办法绕过这个或更好的方法?

2 个答案:

答案 0 :(得分:2)

使这项工作成功的一个想法是,您必须rely on other data来自每条消息,并忽略Twilio的smsid

也许将用户ID,消息正文和时间戳的广泛版本混合在一起(例如,int(UNIX-TIMESTAMP-IN-SECONDS/100)将容忍服务器获取消息和Twilio确认消息之间的100秒延迟。

答案 1 :(得分:1)

感谢您的回复。这是一个艰难的。来自freenode的#couchdb的@rnewson非常友好地花了一些时间思考这个并提出了一个非常好的解决方案:

  • couchdb中的消息文档使用可由服务器或客户端生成的任意_id
  • 当客户端发送消息时,它会生成任意_id并将其放入数据库。服务器观察并将其分派给twilio,然后通过向文档添加twilio_id属性来更新数据库文档
  • 我创建了一个视图,按twilio_id
  • 索引文档
  • 当服务器启动时,它从twilio获取最新消息。为了防止向数据库添加重复记录,它会查询每个twilio id的上述视图。对于每个匹配,它使用匹配的_id_rev来执行更新。对于没有匹配的记录,它会生成一个新的任意_id来执行插入。

对于任何好奇的人,here's the code

再次感谢您的回复!