Multiple Message Processing and Monitoring

Introduction

The Message Monitor GraphQL API extension was developed to solve the problem of batch external message processing. Typically, to process large amounts of messages (which includes sending them, receiving their status, and retrying in case of failure), one would need to create a separate message sending request for each message and perform multiple queries to check the status of each message.

The Message Monitor API optimizes the process by taking advantage of the fact that all users walk along the same shards. Even when a client works with just one contract and performs many external requests, it has to perform block walking along the same blocks for each message. Message Monitor caches the transactions of the last block to provide all users with shard block walking on the backend side.

Also it ensures a transaction error trace is received on the backend if the transaction was not executed onchain within the specified timeout.

Message Monitor GraphQL API extension can be used in 2 ways:

  • subscribe for the statuses of a batch of messages via websocket

  • query the status of a batch of messages with 1 query

GraphQL Query

Let’s look at the following query:

query {
  recentExtInMessageStatuses(
    messages: [
      {
        address: "0:435fcf8a845e46a4c8184adbc9eb0fcede6667022de7ed2470a2f28846171e1c"
        hash: "ce9114726ca73b43601b8ac061e48cf20cc4d88242af91fe08991f0ddfd17c91"
        waitUntil: 1690033160
      }
      {
        address: "0:435fcf8a845e46a4c8184adbc9eb0fcede6667022de7ed2470a2f28846171e1c"
        hash: "d940b81faa2c89d072f459966faf82d33320cb5fb5f1a9fe83cd29d89b17eb68"
        waitUntil: 1690033160
      }
    ]
  ) {
    hash
    status
    transaction {
      hash
      aborted
      compute {
        exit_code
      }
    }
    error
  }
}

Here two external inbound messages’ status is requested with a single query.

The query returns the following result:

{
  "data": {
    "recentExtInMessageStatuses": [
      {
        "hash": "ce9114726ca73b43601b8ac061e48cf20cc4d88242af91fe08991f0ddfd17c91",
        "status": "FINALIZED",
        "transaction": {
          "hash": "70960d6b04938454432389f66a302b9de2d425a0f2e306d366ef38160e058f8d",
          "aborted": false,
          "compute": {
            "exit_code": 0
          }
        },
        "error": null
      },
      {
        "hash": "d940b81faa2c89d072f459966faf82d33320cb5fb5f1a9fe83cd29d89b17eb68",
        "status": "TIMEOUT",
        "transaction": null,
        "error": "Can not resolve error because message BOC is not provided"
      }
    ]
  }
}

One message was successfully finalized. The other encountered some error that cannot be resolved without retrieving message boc.

Let’s modify the query to find out why the second message failed. We will do this by requesting message status through boc:

query {
  recentExtInMessageStatuses(
    messages: [
      {
        address: "0:435fcf8a845e46a4c8184adbc9eb0fcede6667022de7ed2470a2f28846171e1c"
        boc: "te6ccgEBAQEAdQAA5YgAhr+fFQi8jUmQMJW3k9YfnbzMzgRbz9pI4UXlEIwuPDgHR2igIm68kFMUvnKay2UwpYFWHYmG4Vag1hO5G691OghbuF2bNVWeI4ECfNZTs6GDiNvCK3iZ1EfQT4dAoSMoIAAABibrarYBky3vqNzEuRY="
        waitUntil: 1690033160
      }
    ]
  ) {
    hash
    status
    transaction {
      hash
      aborted
      compute {
        exit_code
      }
    }
    error
  }
}GraphQL

GraphQL Subscription

You can also create a websocket subscription to message statuses:

wscat -c your_wss_endpoint -s graphql-ws \\
'{"id":"1","type":"start","payload":{"variables":{},"extensions":{},"operationName":null,"query":"subscription{\\n  recentExtInMessageStatuses(messages:{\\n    address: \\"0:435fcf8a845e46a4c8184adbc9eb0fcede6667022de7ed2470a2f28846171e1c\\", hash: \\"ce9114726ca73b43601b8ac061e48cf20cc4d88242af91fe08991f0ddfd17c91\\", waitUntil: 1690033160 }\\n){\\n    hash\\n    status\\n  }\\n}"}}'

Ever SDK supports additional capabilities that allow to process messages using a special queue. Explore the Ever SDK Message monitor object here.

Last updated