【问题标题】:Recommended way(s) to log events in Corda在 Corda 中记录事件的推荐方式
【发布时间】:2018-08-06 02:47:44
【问题描述】:

我们正在通过 Corda RPC 代理上的 vaultTrack 方法在保管库中捕获新的已提交状态,以便在日志记录中使用。虽然它工作正常,但我们认为它可能会对网络连接造成一些开销。因此,我们决定尝试在 CorDapp 中使用 ServiceHub 来捕获新事件。不幸的是,每次调用流时事件都会发生(基于可观察的概念?)。也许我们没有正确设置?根据您的经验和专业知识,您能否

  1. 建议出了什么问题;和
  2. 对应的解决方案?

更多细节在这里: 因为我们使用 CorDapp 的日志作为性能基准。因此,我们只关注新提交的状态事件。在我们开始的 API 端点中,我们使用 RPC 中的 VaultTrack 来记录每个新的提交状态事件,如下例所示:

虽然 API 似乎工作正常,但我们认为它可能会在整体性能上消耗 RPC 连接,因为每次提交新状态时都会调用 observable。如果我们错了,请纠正我们。因此,我们决定改为在流中记录事件。

在 CorDapp 中,我们使用 ServiceHub 中的 VaultService 将每个新的已提交状态事件记录在流启动器的“调用函数”中,如下例所示:

我们发现 CorDapp 中记录的日志,即流中(来自上面提到的 serviceHub)每次调用流时都会不断获得重复的日志。从我们最初的调查中,我们发现问题是每次启动流时“vaultService”都会被订阅。因此,我们切换回使用 API 端点方法。请您告诉我们在 CorDapp 中捕获事件的正确方法。在我们的性能测试期间记录新提交状态的事件。

【问题讨论】:

    标签: corda


    【解决方案1】:

    订阅流中可观察到的保险库的方法将不起作用。一旦流程结束,订阅将不会终止。每次运行流程时,都会添加一个额外的订阅者。这会降低性能(尽管只要状态序列化足够快,RPC 开销通常非常低)。

    您应该改为使用 RPC 客户端观察保管库的更新。这是一个例子:

    val client = CordaRPCClient(nodeAddress)
    val proxy = client.start(rpcUserUsername, rpcUserPassword).proxy
    
    // Track IOUState updates in the vault
    val (snapshot, updates) = proxy.vaultTrack(IOUState::class.java)
    
    // Log the existing IOUStates and listen for new ones.
    snapshot.states.forEach { logState(it) }
    updates.toBlocking().subscribe { update ->
        update.produced.forEach { logState(it) }
    }
    

    当您在CordaRPCClient 上调用start 时,您将连接到节点的Artemis 消息队列。随着时间的推移,此消息队列将用于将更新从 Vault 流式传输回客户端。

    在上面的示例中,只是记录了保管库更新。您可以根据需要更改此行为(例如,每当生成更新时调用 API)。

    【讨论】:

    • 你会说同样的方法适用于 Corda 4 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多