在Corda中记录事件的推荐方法

在Corda中记录事件的推荐方法,corda,Corda,我们正在通过Corda RPC代理上的vaultTrack方法捕获vault中的新提交状态,以用于日志记录。虽然它工作正常,但我们认为它可能会导致一些网络连接开销。因此,我们决定尝试在CorDapp中使用ServiceHub来捕获新事件。不幸的是,每次调用流时(基于可观察的概念?),事件都会持续发生。也许我们没有正确设置?。根据你的经验和专业知识,你能 提出问题所在;及 相应的解决方案 详情如下: 因为我们使用CorDapp的日志作为性能基准。因此,我们只关注新的承诺状态事件。在我们启动的API

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

  • 提出问题所在;及
  • 相应的解决方案
  • 详情如下: 因为我们使用CorDapp的日志作为性能基准。因此,我们只关注新的承诺状态事件。在我们启动的API端点中,我们使用RPC中的Vault Track记录每个新提交的状态事件,如下例所示:

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

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


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

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

    您应该改为使用RPC客户端观察vault的更新。以下是一个例子:

    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流回到客户端


    在上面的示例中,vault更新仅记录在日志中。您可以根据需要更改此行为(例如,在生成更新时调用API)。

    您是否认为相同的方法适用于Corda 4?