我有处理 JSON 对象的协作 Web 应用程序,如下所示:
var post = {
id: 123,
title: 'Sterling Archer',
comments: [
{text: 'Comment text', tags: ['tag1', 'tag2', 'tag3']},
{text: 'Comment test', tags: ['tag2', 'tag5']}
]
};
我的方法是使用带有jsonpatch库的rfc6902 (JSONPatch) 规范来修补 JSON 文档。所有此类文档都存储在 MongoDB 数据库中,如您所知,最后一个文档对于频繁写入非常慢。
为了获得更快的速度和高负载的应用程序,我使用 redis 作为队列来执行补丁操作,如下所示:
{ "op": "add", "path": "/comments/2", "value": {text: 'Comment test3', tags: ['tag4']}" }
我只是将所有此类补丁操作存储在队列中,并在午夜运行 cron 脚本以获取所有补丁并构建完整文档并在 MongoDB 数据库中更新它。
我还不明白如果补丁损坏,我应该怎么做:
{ "op": "add", "path": "/comments/0/tags/5", "value": 'tag4'}
上面的补丁不适用于上面的文档,因为tags
数组的长度只有 3(根据官方文档https://www.rfc-editor.org/rfc/rfc6902#page-5)
The specified index MUST NOT be greater than the number of elements in the array.
因此,当用户在线时,他不会收到任何错误,因为他的补丁操作存储在 redis 队列中,但第二天由于未在 cron 脚本中应用的损坏的补丁,他得到了损坏的文档。
所以我的问题是如何保证存储在 redis 队列中的所有补丁都是正确的并且不会破坏主文档?