JSON-RPCとは?リモートプロシージャコールの仕組みを分かりやすく解説

スポンサーリンク

JSON-RPCって何?まずは基本から理解しよう

JSON-RPCは「JSON Remote Procedure Call」の略で、離れた場所にあるコンピュータの機能を呼び出すための通信プロトコルです。

「プロシージャコール」と聞くと難しく感じるかもしれませんが、簡単に言うと「別のコンピュータにある関数(機能)を、まるで自分のコンピュータにあるかのように呼び出せる仕組み」なんです。

例えば、あなたが電卓アプリで「42から23を引く」という計算をしたいとします。通常なら、自分のコンピュータで計算しますよね。

でも、もし計算が複雑で、専用のサーバーに計算させたい場合、JSON-RPCを使えば「subtract(引き算)という機能を使って、42と23を処理してね」とサーバーに指示できるわけです。

なぜJSONを使うの?

JSON-RPCの「JSON」の部分は、JavaScript Object Notation(JavaScriptオブジェクト記法)のことです。

JSONは、データをやり取りするための軽量で読みやすい形式なんです。

JSONの特徴

  • 人間にも読みやすい形式
  • コンピュータが処理しやすい
  • 多くのプログラミング言語で対応している
  • データサイズが小さく、通信が速い

例えば、こんな感じでデータを表現します。

{
  "name": "田中太郎",
  "age": 25,
  "city": "東京"
}

見ての通り、とてもシンプルで分かりやすいですよね。

JSON-RPCの基本的な仕組み

JSON-RPCの通信は、主に「リクエスト(要求)」と「レスポンス(応答)」という2つのメッセージでやり取りされます。

リクエスト(要求)の構造

クライアント(依頼する側)がサーバー(処理する側)に送るメッセージには、以下の情報が含まれています。

  • jsonrpc:使用しているプロトコルのバージョン(通常は”2.0″)
  • method:実行したい機能(メソッド)の名前
  • params:機能に渡すパラメータ(引数)
  • id:リクエストを識別するための番号や文字列

レスポンス(応答)の構造

サーバーが処理を終えてクライアントに返すメッセージには、以下の情報が含まれます。

  • jsonrpc:使用しているプロトコルのバージョン
  • result:処理が成功した場合の結果
  • error:エラーが発生した場合のエラー情報
  • id:リクエストと同じID

実際のJSON-RPCのやり取りを見てみよう

言葉だけではピンと来ないかもしれないので、実際の例を見てみましょう。

例:引き算の計算を依頼する場合

クライアントからサーバーへのリクエスト:

{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": [42, 23],
  "id": 1
}

これは「subtract(引き算)という機能を使って、42から23を引いてください」という意味です。

サーバーからクライアントへのレスポンス:

{
  "jsonrpc": "2.0",
  "result": 19,
  "id": 1
}

これは「計算の結果は19です」という意味ですね。

IDが同じなので、クライアントは「これは自分が送ったリクエストに対する答えだ」と分かります。

パラメータの指定方法

JSON-RPCでは、パラメータを2つの方法で指定できます。

配列形式(位置指定)

順番で引数を指定する方法です。

{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": [42, 23],
  "id": 1
}

この場合、最初の数値が「引かれる数」、2番目の数値が「引く数」になります。

オブジェクト形式(名前指定)

名前を付けて引数を指定する方法です。

{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": {"minuend": 42, "subtrahend": 23},
  "id": 3
}

こちらの方が、どのパラメータが何を意味するのか分かりやすいですね。

通知(Notification)という機能

JSON-RPCには「通知」という特別な機能があります。

通常のリクエストは、サーバーからの応答を待ちますが、通知は応答が不要な一方通行のメッセージです。

通知には「id」が含まれません。

{
  "jsonrpc": "2.0",
  "method": "update",
  "params": [1, 2, 3, 4, 5]
}

例えば、ログを送信する場合や、定期的にデータを送るだけで結果を待つ必要がない場合に使われます。

バッチリクエスト機能

JSON-RPCでは、複数のリクエストをまとめて一度に送ることができます。

これを「バッチリクエスト」と呼びます。

[
  {"jsonrpc": "2.0", "method": "sum", "params": [1, 2, 4], "id": "1"},
  {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"},
  {"jsonrpc": "2.0", "method": "multiply", "params": [5, 6], "id": "3"}
]

サーバーは、それぞれのリクエストに対して個別に処理を行い、結果をまとめて返します。

ただし、レスポンスの順番は保証されていません。そのため、IDを使ってリクエストとレスポンスを対応させる必要があります。

エラー処理の仕組み

処理中にエラーが発生した場合、サーバーはエラー情報を返します。

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Method not found"
  },
  "id": 1
}

エラーオブジェクトには以下の情報が含まれます。

  • code:エラーコード(数値)
  • message:エラーメッセージ(文字列)
  • data:追加のエラー情報(オプション)

主なエラーコード

  • -32700:JSON解析エラー(パースエラー)
  • -32600:無効なリクエスト
  • -32601:メソッドが見つからない
  • -32602:無効なパラメータ
  • -32603:内部エラー

JSON-RPCのバージョン

JSON-RPCには主に2つのバージョンがあります。

JSON-RPC 1.0(2005年)

初期バージョンで、基本的な機能を提供していましたが、いくつか問題点がありました。

  • 名前付きパラメータが使えない
  • エラー情報が不十分
  • ピアツーピア通信が前提

JSON-RPC 2.0(現在の標準)

改良版で、2007年に仕様が確定しました。現在はこちらが広く使われています。

  • 名前付きパラメータに対応
  • 詳細なエラー情報
  • クライアント・サーバー型に対応
  • バッチリクエストのサポート
  • 通知機能の改善

JSON-RPCの主な特徴とメリット

シンプルで軽量

仕様が非常にシンプルなので、理解しやすく実装も簡単です。

データ量も少ないため、通信が高速になります。

トランスポート非依存

JSON-RPCは、通信方法(トランスポート層)に依存しません。

以下のような様々な方法で使えます。

  • HTTP/HTTPS
  • WebSocket
  • TCP/IPソケット
  • SSH
  • ファイル入出力

言語非依存

JSONは多くのプログラミング言語でサポートされているため、どんな言語でも使えます。

PythonでもJavaでもJavaScriptでも、同じJSON-RPCの仕様で通信できるんです。

非同期処理に対応

複数のリクエストを送った場合、サーバーは順番通りではなく、処理が終わったものから返すことができます。

これにより、効率的な処理が可能になります。

JSON-RPCの実際の活用例

ブロックチェーン技術(Ethereum)

Ethereumなどのブロックチェーンでは、JSON-RPCが標準的な通信プロトコルとして使われています。

ウォレットアプリケーションがブロックチェーンノードと通信する際、JSON-RPCを使って情報を取得したり、トランザクションを送信したりします。

AI エージェント開発

2024年以降、AIエージェント開発でもJSON-RPCが注目されています。

  • MCP(Model Context Protocol):AnthropicがLLMアプリケーションと外部データソースを統合するために発表したプロトコルで、JSON-RPCがベースになっています
  • A2A Protocol(Agent2Agent Protocol):GoogleがAIエージェント間の通信のために発表したプロトコルで、これもJSON-RPCを基礎にしています

分散システムでのAPI通信

マイクロサービスアーキテクチャなど、複数のサービスが連携するシステムで、サービス間の通信にJSON-RPCが使われることがあります。

RESTful APIとの違い

JSON-RPCとよく比較されるのが、RESTful APIです。

RESTful APIの特徴

  • リソース(データ)に焦点を当てる
  • HTTPメソッド(GET、POST、PUT、DELETEなど)を使い分ける
  • URLが複数のエンドポイントに分かれる

JSON-RPCの特徴

  • メソッド(機能)に焦点を当てる
  • 通常は1つのエンドポイントで全ての機能を提供
  • リクエストの中身(method)で実行する機能を指定

どちらを選ぶべきか

  • RESTful API:リソースの操作が中心の場合、一般的なWeb APIに適している
  • JSON-RPC:複雑な処理や関数呼び出しが中心の場合、シンプルさと高速性が求められる場合

JSON-RPCを使う際の注意点

セキュリティ対策が必要

JSON-RPC自体には、認証や権限管理の仕組みがありません。

HTTPS通信や独自の認証システムを組み合わせる必要があります。

バージョンの互換性

JSON-RPC 1.0と2.0には互換性がありません。

必ず「jsonrpc」フィールドでバージョンを明記しましょう。

予約されたメソッド名に注意

「rpc.」で始まるメソッド名は、内部用に予約されています。

独自のメソッド名には使わないようにしましょう。

エラーハンドリングは必須

適切なエラー処理を実装しないと、問題の原因を特定するのが難しくなります。

エラーコードとメッセージを適切に設定することが大切です。

簡単なPythonでの実装例

JSON-RPCクライアントの簡単な例を見てみましょう。

import requests
import json

def send_json_rpc_request(url, method, params, request_id):
    headers = {'Content-Type': 'application/json'}
    payload = {
        "jsonrpc": "2.0",
        "method": method,
        "params": params,
        "id": request_id
    }
    response = requests.post(url, data=json.dumps(payload), headers=headers)
    return response.json()

# サーバーのURL
url = "http://example.com/json-rpc"

# リクエストを送信
response = send_json_rpc_request(url, "subtract", [42, 23], 1)

# 結果を表示
print(json.dumps(response, indent=4))

このコードは、指定したサーバーに引き算のリクエストを送り、結果を表示します。

まとめ

JSON-RPCは、離れた場所にあるコンピュータの機能を呼び出すためのシンプルで効率的なプロトコルです。

JSONという読みやすいデータ形式を使うことで、人間にもコンピュータにも理解しやすい通信を実現しています。現在広く使われているのはJSON-RPC 2.0で、エラー処理やバッチリクエストなどの機能が充実しています。

主な特徴として、シンプルさ、軽量性、トランスポート非依存、言語非依存といった点が挙げられます。ブロックチェーン技術やAIエージェント開発など、様々な分野で活用されており、特にEthereumでは標準的な通信プロトコルとして採用されています。

RESTful APIと比較すると、JSON-RPCはメソッド(機能)中心の設計で、1つのエンドポイントで全ての機能を提供できるのが特徴です。複雑な処理や関数呼び出しが中心のシステムでは、JSON-RPCの方が適している場合が多いでしょう。

ただし、セキュリティ対策は別途必要になるため、HTTPS通信や認証システムと組み合わせて使用することが重要です。シンプルだからこそ、適切な設計と実装が求められるプロトコルと言えますね。

コメント

タイトルとURLをコピーしました