在路上
2021-12-31
徐老师好,在MillWheel中为了保证消息处理至少一次的语义,Computation的每条消息在发送之后都需要应答,收不到应答就会不断重试。String Production的做法是,下游Computation收到消息后存起来,然后立即应答上游的Computation。Weak Production的做法是,不保存消息,不保存消息就必须等整个链路处理完再逐层应答,链路越长,遇到故障的可能性越大,故障会导致消息从头消费,整个系统的延迟就变大了。解决方法就是Computation在发出消息一段时间后收不到应答,就把消息存起来,并应答上游的Computation。这样如果下游链路出问题,只需要从当前的Computation开始重试,而不用从头开始。
共 1 条评论
10
zart
2022-01-06
徐老师好,每一个 Computation + Key 的组合,在接收到一条消息的处理过程的第一步,消息去重,使用分段的 BloomFilter 来解决,不是会有小概率的误判,导致非重复的消息也会判断为重复,这样就会导致丢数据。请问会有这种情况么?MillWheel如果允许这种情况就做不到ExactlyOnce了吧
共 1 条评论
2
Geek_64affe
2022-10-09
来自浙江
因为没有Checkpoint,所以只能通过不断重试来确保消息不丢失,并且重试的粒度是整个计算过程,如果计算过程比较深,每一个Computation都需要重新计算,很可能会慢于Checkpoint机制
1
InfoQ_cdca53d71446
2022-06-05
"网络传输是乱序的,我们其实并不知道是 X 会先到下游,还是 Y 会先到下游." 这里有点歧义. tcp传输已经解决了包乱序的问题. 这里的乱序, 应该是两个并发tcp连接,发送的包谁先到服务端不确定的意思.
共 1 条评论
1
CRT
2022-01-09
不是很明白保存状态和checkpoint的区别是什么,就像文章说的,如果一个computation已经通过timer发送了消息x,按道理如果故障重启后不会有相同时间窗口的消息才对。
共 1 条评论