Stream
SDS Stream 提供了SDS表中记录更新的有序信息流。当您对表启用Stream时,SDS将捕获表中的记录更新,并根据Stream类型将相关信息以消息形式输出到用户定义的Talos消息队列中。
Stream特性
- more than once 语义,对于已成功写入SDS的记录,相关更新消息至少会送达Talos Consumer一次
- 行级别保序
Stream类型及消息格式
- RECORD_IMAGE,更新后记录视图
- record : 记录视图,如果是整行删除操作,只包含实体组键和主键
- rowDeleted : 行是否被删除
- timestamp : 更新时间戳
- tableName: 操作的表名
MUTATE_LOG,记录更新日志
- record : 记录,如果是整行删除操作,同RECORD_IMAGE;如果是部分删除,record中的key表示删除的属性,value可忽略, 如果是increment操作,record表示increment后的视图
- type : 操作类型,包括Put/Delete/Increment
- rowDeleted : 行是否被删除
- timestamp : 更新时间戳
- amounts: increment操作时该值不为空,表示同IncrementRequest的amounts
- tableName: 操作的表名
KEYS_ONLY,记录更新的键值
- record : 记录键值
- timestamp : 更新时间戳
- tableName: 操作的表名
使用流程
- 在Talos中创建topic
- 建表或更新表schema时,以topic名作为输入,添加Stream
- 向表中生产数据
- 创建Talos consumer,并消费Stream消息
需要注意的问题
- 消息格式中的timestamp是指SDS服务器端的更新时间戳
- MUTATE_LOG是指服务器端操作成功执行后对应的日志,并不完全等同于客户端原始操作,主要有两点区别:
- Batch操作会分解为独立的单元操作,每个单元对应一条消息
- 带condition的操作,如果成功,消息中不会记录condition;如果失败,不会产生消息
- Stream根据表的分片数量分布式收集更新,因此建表时建议对表预分片以提高性能
- 对于MUTATE_LOG类型的stream,在more than once语义下,非幂等操作,如Increment,需要根据消息中得到的记录视图转化成put操作进行重放,或者根据时间戳进行去重再用increment进行重放
进一步工作
- 目前Talos在增加topic partition数目时,无法保序,因此若应用需要行级别保序,暂时只能创建topic时一次性指定partition数目
- 对应Talos的endpoint如下:
- aws北京 => https://awsbj0.talos.api.xiaomi.com
- aws美西 => https://awsusor0.talos.api.xiaomi.com