チームに共通しているが、異なるネットワークから呼び出される特定のタスクを実行するために、単純なRPCサーバーを作成しました。サーバーは次のようになります(簡潔にするためのエラー処理は含まれていません)。
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
import json
class MyProtocol(Protocol):
def dataReceived(self, data):
req = json.loads(data) # create a dictionary from JSON string
method = getattr(self, req['method']) # get the method
method(req['params']) # call the method
def add(self, params):
result = {} # initialize a dictionary to convert later to JSON
result['result'] = sum(params)
result['error'] = None
result['id'] = 1
self.transport.write(json.dumps(result)) # return a JSON string
self.transport.loseConnection() # close connection
factory = Factory()
factory.protocol = MyProtocol
reactor.listenTCP(8080, factory)
reactor.run()
これは非常に簡単です。サーバーはクライアントからJSONRPCリクエストを受信し、メソッドを探し、パラメーターを渡してメソッドを呼び出します。メソッド自体は、JSONRPC応答を返すメソッドです。あまり馴染みのない人にとっては、JSONRPCはおおよそ次のようになります。
request:
{"method":"my_method", "params":[1,2,3], "id":"my_id"}
response:
{"result":"my_result", "error":null, "id":"my_id"}
私が持っているRPCサーバーは、現在の目的を非常にうまく果たしています(ご想像のとおり、私のタスクは非常に単純です)。ただし、タスクの複雑さが増すにつれて、メソッドを追加し続ける必要があります。
def method3(...)
メインファイルを開いてさらに別のファイルを追加し、2週間後に追加するなどしたくありませんdef method4(...)
。コードの成長が速すぎて、メンテナンスがますます難しくなります。
だから、私の質問は、サーバーにメソッドを登録できるアーキテクチャをどのように作成できるかということです。ボーナスは、メソッドごとに1つのファイルを保持する別のフォルダーを用意して、それらを簡単に共有および保守できるようにすることです。この「アーキテクチャ」により、Twistedの理解に関係なく、他の誰かにいくつかのメソッドの保守を延期することもできます。
新しいメソッドが登録されるたびにサーバーを再起動する必要があるかどうかは気にしませんが、私も持っていない場合は明らかなプラスになります:)。
ありがとう。