Actor集群分片中有没有什么方法可以实现AT-MOST once消息投递。
我正在使用Actor Cluster Sharding用于一个用例,其中我有一组集群节点和一组代理节点。
从代理节点i将一些消息转发到Actor集群节点中的Actor Created。
对于此代理节点,将通过ShardRegion代理加入Actor群集。
我必须从代理发送消息到实体演员没有数据丢失或重复(最多一次)交付。
何时会发生数据丢失或重复?
当我发送数据时,我使用Futures从Entity Actors获取确认。该Future对象将等待最多5秒(配置)的确认。在空闲情况下,数据将发送最多一次。
当节点加入/退出/重启时,分片区域内的分片会被重新平衡,此时分片不负责。
如果我们从分片区域代理发送数据,它将被保存在缓冲区中。
在那个时候,如果我的代理服务器重新启动,那么数据将丢失。(DataLoss)。
如果我没有得到答复后,5秒,我重试,这将是一个重复,如果缓冲消息达到后,重新平衡。
为此,我通过调用ActorSelection和Exact IdentityActor路径来检查每条消息是否为IdentityActor Available。
如果碎片正在重新平衡,那么我将把它插入另一个存储层,当Actor在preStart中重新平衡时,我将获取这些数据并在没有数据丢失的情况下进行处理。
但是这种ActorSelection在高数据速率下需要更多的时间。
我如何在没有ActorSelection的情况下改进这一点,以避免数据丢失和数据复制。
1条答案
按热度按时间wz8daaqr1#
“没有数据丢失或重复”是“精确一次”递送(即,至少一次和最多一次)。
一般来说,在分布式系统中,精确的一次交付是不可能的。
最接近的说法是“有效一次”,这基本上意味着将重发与实现接收器相结合,直到发送器确信消息已经被递送,从而能够识别何时正在接收的消息是它已经处理过的消息,在这种情况下,它发回确认(希望发件人最终停止重新发送邮件)在发送的消息中包含相关ID和序列号等技术通常用于帮助接收方确定一条消息正在被第二次处理
请注意,精确一次交付通常没有用:真正需要的是精确一次处理,并且只能由应用程序定义。(发送者和接收者都必须是持久的,并且发送的每个消息将需要四次写入一个数据库):支持基础设施将保证您至少硬一次(假设持久队列),并且接收消息的持久实体参与者可以使用接收到的消息中的
seqNr
来识别副本。