droonga-send

概要

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コマンドを使って下さい。

メッセージの形式のリファレンスの説明にある通り、iddatedatasetの各フィールドはリクエストメッセージの必須フィールドです。 与えられたメッセージがそれらを持っていなかった場合、このコマンドは初期状態で、適切な値を推測または生成して補います。 実際に送信された補完後のメッセージを見るには、--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"
}

利用可能な全てのコマンドの一覧については、コマンドリファレンスを併せて参照して下さい。

他のコマンドとの連携

このメッセージは標準入力を通じて送信するメッセージを受け取れます。 上記の例のように、echocat、およびその他のコマンドをこのコマンドのための入力ソースとして利用できます。 例えば、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クラスタとHTTPで通信する

このコマンドは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プロトコルアダプタに接続する場合は、使い方が若干変わります:

この利用形態においては、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
Droongaクラスタの接続先として使うプロトコル、ホスト名、ポート番号、タグ名。 このオプションは複数回指定できます。 既定の状態では、(--default-protocolによる既定のプロトコル):(このコマンドを実行しているコンピュータの推測された名前):(--default-portによる既定のポート番号)/(--default-tagによる既定のタグ名)が1つだけ指定されたものとして扱われます。
--messages-per-second=N
1秒間に送るメッセージの最大数。 -1を指定した場合、”無制限”を意味します。 既定値は100です。
--default-protocol=PROTOCOL
Droongaクラスタの接続先との通信に使う既定のプロトコル。 取り得る値は以下の通りです:
  • droonga (既定値): Droonga Engineノードのネイティブプロトコル。
  • http: HTTP。
--default-port=PORT
Droongaクラスタの接続先との通信に使う既定のポート番号。 既定値は10031です。
--default-tag=TAG
Droongaクラスタの接続先との通信に使う既定のタグ名。 既定値はdroongaです。
--[no-]report-request
実際に送信されたリクエストのメッセージを報告するかどうか。 既定の状態は、--no-report-requestが指定されている場合に等しいです。 実際に送られたメッセージを見るためには、--report-requestオプションを手動で指定する必要があります。
--[no-]report-throughput
1秒あたりのメッセージのスループットを報告するかどうか。 既定の状態は、--no-report-throughputが指定されている場合に等しいです。 スループットを報告するには、--report-throughputオプションを手動で指定する必要があります。
--default-dataset=NAME
メッセージの既定の送信先データセット名。 既定値はDefaultです。
--default-target-role=ROLE
メッセージを処理できるEngineノードの既定のロール。 以下のいずれかを指定します:
  • 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