droonga-request
は、レスポンスを待たずに任意のメッセージをDroongaクラスタに送ります。
このコマンドはDroongaネイティブプロトコルとHTTPの両方に対応しています。 Droonga Engineノードに対しては、Droongaネイティブのメッセージを直接送れます。
リクエストに対するレスポンスを見る必要がある場合は、droonga-request
コマンドの説明も併せて参照して下さい。
例えば、192.168.100.50
というDroonga Engineノードがあり、同一ネットワークセグメント内のコンピュータ192.168.100.10
にログインしている場合、add
コマンドのメッセージを送信するコマンド列は以下のようになります:
(on 192.168.100.10)
$ echo '{"type":"add","body":{"key":"id1","values":{"name":"Adam","age":20}}}' |
droonga-send --server droonga:192.168.100.50:10031/droonga
このコマンドは通常、何もメッセージを出力しません。
リクエストが正常に処理されたかどうかを知る必要がある場合には、代わりにdroonga-request
コマンドを使って下さい。
メッセージの形式のリファレンスの説明にある通り、id
、date
、dataset
の各フィールドはリクエストメッセージの必須フィールドです。
与えられたメッセージがそれらを持っていなかった場合、このコマンドは初期状態で、適切な値を推測または生成して補います。
実際に送信された補完後のメッセージを見るには、--report-request
オプションを指定して下さい:
(on 192.168.100.10)
$ echo '{"type":"add","body":{"key":"id1","values":{"name":"Adam","age":20}}}' |
droonga-send --server droonga:192.168.100.50:10031/droonga --report-request
Request: {
"type": "add",
"body": {
"key": "id1",
"values": {
"name": "Adam",
"age": 20
}
},
"id": "1430990130.1114423",
"date": "2015-05-07T09:15:30.111467Z",
"dataset": "Default"
}
利用可能な全てのコマンドの一覧については、コマンドリファレンスを併せて参照して下さい。
このメッセージは標準入力を通じて送信するメッセージを受け取れます。
上記の例のように、echo
、cat
、およびその他のコマンドをこのコマンドのための入力ソースとして利用できます。
例えば、drndump
の出力もそのまま入力ソースとして利用できます:
(on 192.168.100.10)
$ drndump --host 192.168.100.50 --receiver-host 192.168.100.10 | \
droonga-send --server droonga:192.168.100.50:10031/droonga
テキストファイルを入力ソースとして使うこともできます。 このコマンドは以下のように、コマンドライン引数として指定されたファイルの内容を読み込んで利用します:
(on 192.168.100.10)
$ cat /tmp/message.json
{"type":"system.status"}
$ droonga-send --server droonga:192.168.100.50:10031/droonga /tmp/message.json
このコマンドは複数のメッセージを一度に送る事もできます。 複数メッセージの一括送信は、単に、複数のメッセージを入力として与えるだけで行えます:
(on 192.168.100.10)
$ echo '{"type":"add","body":{"key":"id1","values":{"name":"Adam","age":20}}} {"type":"add","body":{"key":"id2","values":{"name":"Becky","age":30}}}' |
droonga-send --server droonga:192.168.100.50:10031/droonga
もちろん、以下のようにしてソースファイル内に複数のメッセージを含めることもできます:
(on 192.168.100.10)
$ cat /tmp/messages.jsons
{"type":"add","body":{"key":"id1","values":{"name":"Adam","age":20}}}
{"type":"add","body":{"key":"id2","values":{"name":"Becky","age":30}}}
$ droonga-send --server droonga:192.168.100.50:10031/droonga /tmp/messages.jsons
非常に多くのメッセージに対して、ラウンドロビン型のロードバランサーの挙動を再現するために、--server
オプションを複数回使って複数のエンドポイントを指定することもできます:
(on 192.168.100.10)
$ droonga-send --server droonga:192.168.100.50:10031/droonga \
--server droonga:192.168.100.51:10031/droonga \
--server droonga:192.168.100.52:10031/droonga \
/tmp/messages.jsons
この時、メッセージは各エンドポイントに並行してばらまかれます。
過負荷の状態を再現するには、以下のように--messages-per-second
オプションを指定します:
(on 192.168.100.10)
$ droonga-send --server droonga:192.168.100.50:10031/droonga \
--server droonga:192.168.100.51:10031/droonga \
--server droonga:192.168.100.52:10031/droonga \
--messages-per-second=1000 \
/tmp/messages.jsons
このオプションの既定値は100
ですが、コマンドを実行しているコンピュータの性能が十分に高ければ、制限を緩和することができます。
このオプションによる制限値は各エンドポイントごとに適用されるため、この例の場合、クラスタは最大で毎秒3000件のメッセージを受け取ることになります。
このコマンドはDroonga Engineとの接続だけでなく、以下のようにしてHTTPプロトコルアダプターとも通信できます:
(on 192.168.100.10)
$ echo '{"type":"add","body":{"key":"id1","values":{"name":"Adam","age":20}}}' |
droonga-send --server http:192.168.100.50:10041 --report-request
Request: {
"method": "GET",
"path": "/droonga/add?key=id1&values[name]=Adam&values[age]=20",
"headers": {
"Accept": "*/*",
"User-Agent": "Ruby"
},
"body": null
}
HTTPプロトコルアダプタに接続する場合は、使い方が若干変わります:
--server
オプションにおいて、プロトコルとしてhttp:
を指定し、HTTPプロトコルアダプター用に正しいポート番号を指定する必要があります。
ポート番号は既定の状態ではDroonga Engineノード用に10031
になっていますが、通常、HTTPプロトコルアダプターは10041
番ポートを使います。この利用形態においては、HTTP用のリクエストメッセージを入力として与えることができます。 通常のDroongaネイティブプロトコルのメッセージは、上記の例のように自動的にHTTP用のリクエストメッセージに変換されます。
同様の体裁で、独自のHTTPリクエストメッセージを入力として与えることもできます。 以下は、POSTメソッドで、独自のユーザーエージェント文字列を伴ったPOSTメソッドのHTTPリクエストを送信する例です:
(on 192.168.100.10)
$ echo '{"method":"POST","headers":{"User-Agent":"Droonga Client"},"path":"/droonga/add","body":{"key":"id1","values":{"name":"Adam","age":20}}}' |
droonga-send --server http:192.168.100.50:10041 --report-request
Request: {
"method": "POST",
"path": "/droonga/add",
"headers": {
"User-Agent": "Droonga Client",
"Accept": "*/*"
},
"body": "{\"key\":\"id1\",\"values\":{\"name\":\"Adam\",\"age\":20}}"
}
--server=PROTOCOL:HOST:PORT/TAG
(--default-protocolによる既定のプロトコル):(このコマンドを実行しているコンピュータの推測された名前):(--default-portによる既定のポート番号)/(--default-tagによる既定のタグ名)
が1つだけ指定されたものとして扱われます。--messages-per-second=N
-1
を指定した場合、”無制限”を意味します。
既定値は100
です。--default-protocol=PROTOCOL
droonga
(既定値): Droonga Engineノードのネイティブプロトコル。http
: HTTP。--default-port=PORT
10031
です。--default-tag=TAG
droonga
です。--[no-]report-request
--no-report-request
が指定されている場合に等しいです。
実際に送られたメッセージを見るためには、--report-request
オプションを手動で指定する必要があります。--[no-]report-throughput
--no-report-throughput
が指定されている場合に等しいです。
スループットを報告するには、--report-throughput
オプションを手動で指定する必要があります。--default-dataset=NAME
Default
です。--default-target-role=ROLE
service-provider
:
メッセージは、クラスタ内でサービスを提供中のノードで処理されます。
データ抽出操作に関わるノードには、後から遅れてメッセージが伝搬します。absorb-source
:
メッセージは、クラスタへのノード追加操作におけるデータコピー元となっているノードで処理されます。
サービスを提供中のノード、並びにデータコピー先となっているノードへは、メッセージは伝搬しません。absorb-destination
:
メッセージは、クラスタへのノード追加操作におけるデータコピー先となっているノードで処理されます。
サービスを提供中のノード、並びにデータコピー元となっているノードへは、メッセージは伝搬しません。any
:
メッセージは、--host
で指定されたノードで処理されます。既定値はany
です。
--[no-]completion
--completion
が指定されている場合に等しいです。
(既定のフィールドが欠落した)壊れたメッセージを意図的に送りたい場合は、--no-completion
オプションを手動で指定する必要があります。--[no-]validation
--validation
が指定されている場合に等しいです。
妥当でない内容のメッセージを意図的に送りたい場合は、--no-validation
オプションを手動で指定する必要があります。--help
このコマンドは、Rubygemsのパッケージdroonga-client
の一部としてインストールされます。
# gem install droonga-client