JVM 崩溃后谁负责 re-create 个持久性 actor 实例?
Who is in charge of re-create persistant actor instance after JVM crash?
我正在评估是否使用Akka和akka persistent作为某个项目的关键工具包,其中有一个复杂的后台运行进程(可能每天固定时间由Quartz触发)。
back-ground运行进程将通过HTTP通信与许多不同的外部服务进行通信,将在本地生成许多加密文件,并通过SFTP传输。
从业务角度:
- 该服务是关键业务,大概会自动从用户的银行卡中扣取N百万用户的钱,并帮助他们购买一些基金产品。
技术角度:
- 无论出于何种原因,例如网络问题,每个外部服务都可能不可用,外部服务可能 运行 超出其资源(即 jdbc 连接)。
- 我们的服务可能会被终止、重新启动、re-deployed 由于紧急原因或因某些意外错误而崩溃。
- 一旦进程以未完成的作业重新启动,则需要使用不同的策略从容地完成它们,例如重做、确认外部系统业务状态以及从某个检查点恢复。
我正在阅读官方 AkkaScala.PDF,还有一些 youtube 会议视频,他们都提到,在 JVM 崩溃后,可以通过重播日志中的事件来恢复 actor 的状态。
但这一定是个愚蠢的问题,因为我没有发现有人在讨论它:
假设服务中有1000个持久化actor,服务的JVM崩溃重启,谁负责触发re-create新创建的actor中的那1000个持久化actor单进程模式和集群模式下的系统?如何?或者我应该先阅读哪些文章?
您应该阅读 Akka Persistence
和 Akka Persistence Query
的基础知识。但可能,我首先想到的是使用 Akka Persistence Query
AllPersistenceIdsQuery or CurrentPersistenceIdsQuery。它会给你所有的持久性 ID,你可以用它来重新点燃你的持久性演员。特定 persistent id
的持久性参与者将重播事件存储日志中的所有事件。你可以服用snapshots
来加速恢复。您的事件存储可能是某种数据库(例如 Cassandra)。考虑到您的持久性 actor 具有特定的可变状态,它将在恢复后恢复到其最后的状态。恢复可能需要一些时间。
我正在评估是否使用Akka和akka persistent作为某个项目的关键工具包,其中有一个复杂的后台运行进程(可能每天固定时间由Quartz触发)。
back-ground运行进程将通过HTTP通信与许多不同的外部服务进行通信,将在本地生成许多加密文件,并通过SFTP传输。
从业务角度:
- 该服务是关键业务,大概会自动从用户的银行卡中扣取N百万用户的钱,并帮助他们购买一些基金产品。
技术角度:
- 无论出于何种原因,例如网络问题,每个外部服务都可能不可用,外部服务可能 运行 超出其资源(即 jdbc 连接)。
- 我们的服务可能会被终止、重新启动、re-deployed 由于紧急原因或因某些意外错误而崩溃。
- 一旦进程以未完成的作业重新启动,则需要使用不同的策略从容地完成它们,例如重做、确认外部系统业务状态以及从某个检查点恢复。
我正在阅读官方 AkkaScala.PDF,还有一些 youtube 会议视频,他们都提到,在 JVM 崩溃后,可以通过重播日志中的事件来恢复 actor 的状态。
但这一定是个愚蠢的问题,因为我没有发现有人在讨论它:
假设服务中有1000个持久化actor,服务的JVM崩溃重启,谁负责触发re-create新创建的actor中的那1000个持久化actor单进程模式和集群模式下的系统?如何?或者我应该先阅读哪些文章?
您应该阅读 Akka Persistence
和 Akka Persistence Query
的基础知识。但可能,我首先想到的是使用 Akka Persistence Query
AllPersistenceIdsQuery or CurrentPersistenceIdsQuery。它会给你所有的持久性 ID,你可以用它来重新点燃你的持久性演员。特定 persistent id
的持久性参与者将重播事件存储日志中的所有事件。你可以服用snapshots
来加速恢复。您的事件存储可能是某种数据库(例如 Cassandra)。考虑到您的持久性 actor 具有特定的可变状态,它将在恢复后恢复到其最后的状态。恢复可能需要一些时间。