测验:Saga 与 Outbox
双重写入问题的准确定义是什么?
- 将同一份数据保存到两张表中
- 两个服务更新同一行
- 由于复制延迟而读到旧值
- 数据库写入与消息代理发布不具备原子性,可能只有一方成功
发件箱模式能保证什么,又不能保证什么?
- 消除事件丢失,但仍可能重复
- 既不丢失也不重复
- 消除重复,但仍可能丢失
- 丢失和重复都可能发生
为什么要将发件箱表中的 aggregate_id 用作分区键?
- 同一聚合的行会聚集到一个节点,从而加快查询
- 同一聚合的事件进入同一分区,从而保持顺序
- 相同键的载荷会一起压缩,以节省存储空间
- 相同键的事件会合并为一条,从而消除重复
Saga 的补偿事务与“回滚”有什么不同?
- 不是撤销已经发生的事,而是向前执行一个新的抵消动作
- 不锁定相同资源,所以总能比回滚快得多
- 数据库会倒放事务日志并代为处理
- 只处理已提交的数据,因此不可能失败
当 Saga 扩展到五个或更多步骤时,推荐哪种形式?
- 编排中的舞蹈式协作:各服务监听事件并自行决定下一步
- 2PC:把五个步骤合并成一个分布式事务
- 集中式编排:由中央协调器指定执行顺序
- 同步调用链:一个服务依次调用下一个服务
微服务通常不采用 2PC 的主要原因是什么?
- 实现困难,而且几乎没有支持它的库
- 协调器故障时参与者可能一直被锁定,导致可用性下降
- 每个服务使用不同协议,因此不存在标准
- 提交需要两次往返,所以只是速度较慢