【Corda4.5】 SendAll을 사용하여 효율적으로 다른 노드에 메시지를 보냅니다.

소개



최근 다시 Corda에 잠겨 있습니다.
도, 노부 코후입니다.

이번에는 Corda4.5의 새로운 기능의 주요점? 이기도 한 "SendAll"을 소개하려고합니다.

SendAll이란?



Corda4.5에서 새로 도입된 API 입니다.
SendAllMap도 아울러 신규 도입되고 있습니다만, 이번은 생략하겠습니다.

이전에는 Send API를 사용하여 각 카운터 당사자에게 한 번만 메시지를 보냈습니다.
SendAll을 사용하면 유사한 처리를 효율적으로 수행할 수 있습니다.

Send/Receive 및 SendAll/ReceiveAll과 같은 메시지 송수신의 개요는 이쪽

API에 대한 자세한 내용은 문서를 참조하세요.
htps : // 아피. 이 r이다. 네 t/아피/코 r다-오/4.5/HTML/아피/코 tぃん/코 r다/네 이 r이다. 이것. fぉws/-fぉw-ぉ기 c/선 d-있음. HTML

소스 코드



[PR] 이번에도 샘플 소스 코드가 준비되어 있습니다.
바삭바삭해 보고 싶은 분은 사용해 보세요.

SendAll을 사용하는 Flow와 Send를 사용하는 Flow의 양자를 준비하고 있기 때문에 비교가 쉽다고 생각합니다.

▼Github
※최신판에서는 Tx를 발행할 수 있도록 하고 있습니다만, 아래와 같은 시나리오에서는 Tx는 발행하고 있지 않습니다
htps : // 기주 b. 코 m /의 b 코 vs 키이 / 코 r다 _ 센다 l _ mp

해설



기본적으로는, 소스 코드를 보시면 알 수 있을까 생각합니다만, 간단하게 해설을 실시합니다.
※해설에 불필요한 부분은 삭제하고 있습니다
  • Session을 치십시오. (①)
  • 이번은 샘플 때문에, 목적지를 고정하고 있습니다.

  • Session Set 및 payload(메시지)를 인수로 지정합니다. (②)
  • 수신자(responder)는 payload(메시지)와 동일한 유형을 수신합니다. (③)
  • class Initiator(private val data: String) : FlowLogic<Unit>() {
        @Suspendable
        override fun call() {
            // String -> Party
            val b = toParty("O=PartyB,L=New York,C=US")
            val c = toParty("O=PartyC,L=New York,C=US")
    
            // sessionを張る
            // サンプルのため、宛先は固定
            //  --------------------------------- ①
            val sessionB = initiateFlow(b)
            val sessionC = initiateFlow(c)
    
            // sendAll(payload: Any, sessions: Set<FlowSession>, maySkipCheckpoint: Boolean = false): Unit
            //  --------------------------------- ②
            sendAll(data, setOf(sessionB, sessionC)) 
        }
    
        private fun toParty(name: String): Party {
            println(name)
            val x500Name = CordaX500Name.parse(name)
            return serviceHub.networkMapCache.getPeerByLegalName(x500Name) as Party
        }
    }
    
    
    @InitiatedBy(Initiator::class)
    class Responder(val counterPartySession: FlowSession) : FlowLogic<Unit>() {
        @Suspendable
        override fun call() {
            // receiveAll(receiveType: Class<R>, sessions: List<FlowSession>, maySkipCheckpoint: Boolean = false): List<UntrustworthyData<R>>
            //  --------------------------------- ③
            val list = receiveAll(String::class.java, listOf(counterPartySession))
            list[0].unwrap { data -> println(data) }
        }
    }
    

    실행 결과



    그런 다음 실행 결과입니다.
    【주의】 : 이번 시나리오는 단순히 메시지를 보내고 있기 때문에 본 결과 = TPS가 아닙니다.

    ▼실행 환경




    개요
    설명


    코르다
    OSS 4.5

    PC
    Windows10 64bit(core i7,8GB)

    Node
    A~E+Notary의 총 6대.


    ▼시나리오



    PartyA에서 다른 모든 노드에 메시지를 보냅니다.
    SendAll과 Send를 각각 10회 실행한다.

    ▼실행 결과



    평균이라도, 순간 풍속에서도 SendAll 쪽이 우수한 결과가 나왔습니다.
    ※단위는 ms


    ↓의 Gif는 실제로 움직여 본 애니메이션입니다.
    뒤에서 여러가지 기동하고 있었기 때문에, 처리 시간이 상기보다 걸리고 있습니다만, SendAll 쪽이 한순간에 각 노드에 송신하고 있는 것처럼 보이는 것은 아닐까요.



    배치


    PartyA
    PartyD

    PartyB
    PartyE

    PartyC
    Notary




    결론



    이번에는 Corda4.5에서 신규 도입된 「FlowLogic.SendAll」을 소개했습니다.
    Corda OSS에서는 멀티스레드로의 동작을 할 수 없기 때문에, 이러한 퍼포먼스 향상계의 API는 기쁘네요.

    Corda의 TPS에 있어서, 병목이 되고 있는 것은 서명을 모으는(확인하는) 처리이므로, 향후에 기대합니다.
    ※OSS의 CollectSignatureFlow에서는 send를 사용하고 있던 인식으로, sendAll의 사용 개소는 거의 없다

    Github에 들고 있는 소스 코드에는 send와 Tx 발행의 양쪽 모두를 실행할 수 있게 되어 있으므로 참고해 보세요.

    이번은 여기까지입니다.
    고마워요.

    좋은 웹페이지 즐겨찾기