【问题标题】:Modifying the behaviour of Corda service object at runtime在运行时修改 Corda 服务对象的行为
【发布时间】:2018-10-16 23:04:29
【问题描述】:

是否可以在运行时更新/修改 Corda 服务对象(单例)的方法(行为)?例如:

如下图所示,Corda 服务对象中有一个函数,它跟踪库更新,对状态数据进行一些处理,然后对外部系统进行 API 调用。在某些时候,处理状态数据的逻辑可能会发生变化,并且希望在运行时修改行为而不重新启动我的 Corda 节点。

Corda 服务是正确的做法吗? Java 工具 API 或 Java Assist 或任何其他字节码重写工具可能会有所帮助吗?

private fun trackVaultAndUpdateExternalSystem() {
val ourIdentity = ourIdentity()
serviceHub.vaultService.trackBy<State>().updates.subscribe { update: Vault.Update<State> ->
    update.produced.forEach { message: StateAndRef<State> ->
        val state = message.state.data
        if (state.recipient == ourIdentity) {
            // do some processing and then make an API call to the external system
        }
    }
}

【问题讨论】:

  • 为什么要在运行时改变它?
  • 运行时我的意思是不停止corda节点,然后更新corda服务对象并重新启动节点。比如动态更新逻辑而不重新启动corda节点。我猜整个服务对象只能有一个实例。

标签: corda


【解决方案1】:

可以使用 JDWP 来完成,但我完全不推荐这样做。 Corda 旨在容忍停机时间。如果您的节点离线一段时间,您不会丢失消息或导致交易对手观察到错误。如果您的应用无法忍受几秒钟的停机时间,那么您需要应用热插拔,但我们今天并未正式支持此功能。

【讨论】:

  • 知道了,谢谢。我想目前最理想的方法是构建一个具有上述功能的容错客户端 Observer。这将需要运行配置为主从集群的观察者副本,其中主节点负责实际执行上述功能,并且在主节点故障的情况下,其他一些副本将接管。我不确定 ZK 是否适合它,或者 etcd/raft 或 K8s 在开发/维护方面是否会是更好的选择。有什么想法吗?
  • 这里的意图是拥有一个 HA RPC 客户端吗?如果是这样,我们知道我们需要做更多的工作来实现这一点 - 这是我们过去几周一直在讨论的事情。
  • 是的,目的是拥有一个 HA RPC 客户端。
  • 是的,不幸的是我们。什么时候需要?
  • 现在并不紧急。如果 R3 正在为此计划设计/架构开源,那就太好了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多