如何解决在分片的Akka群集中安排广播消息
我正在尝试根据时间表(例如,上午8点,上午9点等,以类似cron的方式)找出在分片集群中触发某个类型的所有参与者的最佳方法。
我的计划是在集群中只有一个“计时器”演员,该演员将按计划向其他集群的演员发送广播消息。但是,我不确定这是否可行和最佳。 Akka Scheduler不提供类似cron的配置。 akka-quartz-scheduler似乎不适合Akka群集。
是否有可能从分片的Akka集群内部触发基于计划的操作,也许使用Spring计划等其他框架的功能?还是最好在分片的Akka群集之外部署调度服务,然后使用它向Akka群集发送定期触发事件?
此外,是否可以向分片的Akka群集中的所有特定类型的演员广播消息?
解决方法
是否有可能从分片的Akka集群内部触发基于计划的操作?
通常是。但这取决于计划事件的准确性和计划的类型。让我们假设一个简单的时间表,例如每天的08:00,对高精度都不感兴趣。可以使用TimerScheduler创建一个actor,让其命名为TimerSchedulerActor
。给定特定的时间表,例如每天{8:00} TimerSchedulerActor
计算闹钟下一次发出警报的时间,例如01.09.2020 08:00,然后TimerSchedulerActor
计算从当前时间java.lang.System.currentTimeMillis
到01.09.2020 08:00需要等待的持续时间。当TimerScheduler关闭时,TimerSchedulerActor
发送消息并计算该计划的下一个警报时间戳。
如果一个TimerSchedulerActor
负责所有消息,则应确保只有TimerSchedulerActor
正在运行(Singleton actor),因为多个TimerSchedulerActors
将为每个计划的事件发送多个消息。您也可以拆分具有不同的TimerSchedulerActors
来通知不同组的Actor或负责不同的事件。
或者最好在分片的Akka群集之外部署调度服务,并使用 将定期事件发送到Akka集群?
在Akka群集中可以更轻松地维护,更易于部署和调试调度服务。但是,答案取决于作者的技能和经验。熟悉Akka外部的调度系统的人(例如cron)也许可以通过在Akka外部进行思考来找到更快的解决方案。我建议在Akka Cluster中提供一种解决方案,因为它提供了更大的灵活性。例如,如果面临从Java集群内部更改cron(或另一个外部系统)的请求,那么复杂性就会增加。
此外,是否可以向分片的Akka群集中的所有特定类型的演员广播消息?
这取决于演员类型。 Cluster Receptionist可用于查找特定演员。如果您控制消息,并且可以在消息和参与者中添加所需的参与者类型,那么一个好的策略是将消息发送给所有此类潜在参与者,并让他们根据消息的类型来行动。正确类型的参与者可以对消息执行操作,而另一类型的参与者可以忽略该消息。
,您可以:
- 公开一个HTTP端点,该端点将触发一些任务,并让气流或简单的cron作业命中该端点
- 使用石英,既可以是石英,也可以是石英。我认为它完全适合akka群集。您认为阻滞剂是什么?可行的做法可能是运行集群单例actor,在其中运行基于石英的基于计划的动作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。