在Rust中是否有任何规范的方式来发布一个频繁更新的'状态',这样任何数量的消费者都可以在不提供对对象本身的访问的情况下读取它?
我的用例是,我有一个信息流通过web套接字进来,并希望有聚合指标可供其他线程使用。人们可以用Kafka这样的东西在外部做到这一点,我可能会推出自己的内部解决方案,但想知道是否有其他方法?
我在Go中使用的另一种方法是让消费者向生产者注册自己,每个生产者接收一个通道,生产者简单地分别发布到每个通道。一般来说,消费者的数量很少,所以这可能很有效,但我想知道是否有更好的方法。
听起来你想要一个"广播频道"。
如果您使用的是async
,那么流行的tokio
crate在其sync::broadcast
模块中提供了一个实现:
多生产者、多消费者广播队列。每个发送的值都被所有消费者看到。
Sender
用于向所有连接的Receiver
广播值。Sender
句柄是可克隆的,允许并发发送和接收操作。[…][…]
通过调用
Sender::subscribe
创建新的Receiver
句柄。返回的Receiver
将接收调用subscribe
后发送的值。
如果这还不太符合你的喜好,还有其他箱子提供类似的类型,可以通过搜索"broadcast"crates.io。