idempotency
feishu.events.idempotency
¶
SeenStore
¶
Bases: Protocol
事件去重存储的协议接口。
飞书在投递超时时会重试推送,导致同一 event_id 多次到达。实现本协议即可为接收器
(create_event_route、
create_card_route)或
EventDispatcher 提供幂等保证。
通过 InMemorySeenStore 即得到一个内置实现,
生产环境可改用基于 Redis 等共享存储的实现。
本协议使用 runtime_checkable,可用 isinstance 进行结构化校验。
飞书文档
源代码位于: feishu/events/idempotency.py
seen
async
¶
InMemorySeenStore
¶
基于进程内存、带 TTL 的 SeenStore 实现。
将已处理的 event_id 连同过期时间存入字典,每次访问时清理过期项。适合单进程部署与测试;
多副本部署时各进程内存互不共享,应改用基于共享存储的实现。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
float
|
记录的存活时长(秒),超过后视为未见过。默认 |
3600.0
|
|
Callable[[], float]
|
单调时钟函数,默认 |
monotonic
|
示例:
| Python Console Session | |
|---|---|
源代码位于: feishu/events/idempotency.py
add
async
¶
原子地认领 event_id:此前未标记(或已过期)则标记并返回 True,否则返回 False。
将 seen 检查与 mark 标记合并在同一把锁内完成,消除二者之间的检查-标记竞态——
并发投递的重复事件中只有一个会得到 True。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
str
|
待认领的事件标识。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
bool
|
首次认领返回 |
源代码位于: feishu/events/idempotency.py
seen
async
¶
claim
async
¶
向 store 认领 event_id,返回是否为首次见到(应处理)。
若 store 提供原子的 add(event_id) -> bool(如
InMemorySeenStore)则优先使用,从而在并发重复投递下
也能保证「检查并标记」原子完成;否则回退到 seen() + mark() 两步(语义不变,其原子性由具体存储自行保证)。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
SeenStore
|
事件去重存储。 |
必需 |
|
str
|
待认领的事件标识。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
bool
|
首次见到返回 |