【问题标题】:pymongo : can't use resume token stored in Redispymongo:不能使用存储在 Redis 中的恢复令牌
【发布时间】:2021-05-03 12:47:26
【问题描述】:

我正在尝试使用 pymongo 来侦听更改流,同时对故障/重启具有弹性。因此,我将恢复令牌存储在 Redis 中以供以后重用。

这是我试过的代码

# Skipping pymongo and redis initialisation

if redis.exists('resumeToken'):
   resume_token = pickle.loads(redis.get('resumeToken'))
else:
   resume_token = None
stream = db.my_collection.watch(
            pipeline=[{'$match': {'fullDocument.type': 'something'}}],
            resume_after=resume_token,
            full_document='updateLookup',
            max_await_time_ms=500
        )
change = stream.next()
redis.set('resumeToken', pickle.dumps(change['_id']))
print(change)

第一次运行时,会打印一个更改,然后我会在 Redis 中存储一些内容。

但如果我重新运行,我得到以下错误:

pymongo.errors.OperationFailure: The resume token UUID does not exist. Has the collection been dropped?

我正在使用 MongoDB 3.6.1 和 pymongo 3.7.1-1.1。

有人知道为什么我的简历令牌被拒绝了吗?

【问题讨论】:

  • 检查 resumeToken GET/SET value redis 命令。

标签: mongodb pymongo pickle changestream


【解决方案1】:

首先,这不是用于恢复更改流的正确模式。请参阅https://docs.mongodb.com/ruby-driver/master/tutorials/ruby-driver-change-streams/#resuming-a-change-stream,根据需要适应 Python 或查看 pymongo 文档以获取等效项。

其次,resume token 是一个文档。如果天真地腌制和取消腌制它不起作用,请先将其转换为原生 Python 数据类型(例如,序列化为扩展的 JSON 文档),然后腌制/取消腌制该序列化。恢复时需要重新创建正确类型的实例。

第三,验证在你阅读了你写到 redis 的内容之后,你会得到你写的内容。 Redis 不是通用的持久性系统。

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2021-02-15
    • 2019-01-06
    • 2018-07-30
    • 2021-04-12
    相关资源
    最近更新 更多