
BoltzEngine の入力 API の種類はどのようなものがあり、どのような違いがありますか
BoltzEngine は、送信情報入力 API として、net/rpc、JSON-RPC、HTTP API Gateway(http-proxy)、CSV入力コマンド を持ちます。
今後の開発は gRPC を中心に進むため、新規の開発では gRPC の利用を推奨します。
gRPC
バージョン 2.0 から利用可能な API です。net/rpc と異なり、Ruby や C# など、多くの言語からリクエストを送ることができます。また、この API は APNs と FCM (GCM) のトークンをまとめて一つのリクエストで送るようになっています。
1msg := rpc.Message{
2 // APNsトークンが.Tokensに存在しない場合は不要
3 ApnsHeader: &apns.Header{
4 Address: "gateway.push.apple.com:2195",
5 KeyPEMBlock: key,
6 CertPEMBlock: cert,
7 },
8 // FCM(GCM)登録IDが.Tokensに存在しない場合は不要
9 GcmHeader: &gcm.Header{
10 RequestURL: "https://android.googleapis.com/gcm/send",
11 ServerKey: serverKey, // FCM(GCM)サーバキー
12 },
13 // WebPushトークンが.Tokensに存在しない場合は不要
14 WebpushHeader: &webpush.Header{
15 Subject: "mailto:boltz@example.com",
16 PrivateKey: privateKey, // VAPID PrivateKey
17 PublicKey: publicKey, // VAPID PublicKey
18 },
19 Tokens: []string{
20 "1(16進APNsトークン)",
21 "2(FCM(GCM)登録ID)",
22 `4{"v":1,"endpoint":"(WebPushエンドポイント)","p256dh":"(ブラウザ公開鍵)","auth":"(WebPush乱数)"}`,
23 },
24 Priority: rpc.Priority_HIGH,
25 // APNsトークンが.Tokensに存在しない場合は不要
26 Payload: `{"aps":{"alert":"hello","badge":1}}`,
27 // FCM(GCM)登録IDが.Tokensに存在しない場合は不要
28 Parameters: &gcm.Parameters{
29 Data: map[string]string{
30 "alert": "hello",
31 },
32 },
33 // WebPushトークンが.Tokensに存在しない場合は不要
34 Body: "hello",
35 // 1秒で送る見込み通知数; 0なら無制限
36 BandWidth: 0,
37}
38stream, err := c.Send(context.Background(), &msg)
39if err != nil {
40 log.Fatalln("Send:", err)
41}
net/rpc
BoltzEngine 標準の通信 API です。Go 言語標準パッケージである net/rpc パッケージ の機能を使用して通信します。 BoltzEngine 本来のパフォーマンスを引き出すことができますが、通知メッセージをキューイングする処理も Go 言語で実装する必要があります。 Go 言語を使用して BoltzEngine に APNs の通知をキューイングするには以下のようなコードを記述します。
1req := &apns.Request{
2 Addr: "gateway.push.apple.com:2195",
3 Credential: config.Credential(),
4 Messages: []*Message{},、
5}
6for i, token := range tokens {
7 msg := &apns.Message{
8 ID: uint32(i),
9 Token: token,
10 Payload: []byte(`{"aps":{"alert":"hello"}}`),
11 }
12 req.Messages = append(req.Messages, msg)
13}
14c, err := rpc.Dial("tcp", "boltz-server:13010")
15if err != nil {
16 log.Fatal("Dial:", err)
17}
18defer c.Close()
19
20var resp apns.Response
21err = c.Call("BoltzEngine.BroadcastMessagesToAPNs", req, &resp)
22if err != nil {
23 log.Fatal("Call:", err)
24}
JSON-RPC
JSON-RPC v1.0 形式で通信を行います。各言語の対応ライブラリを使用するかソケット通信を使用して通信します。 ストリームとしてデータを扱うため比較的高速にデータを処理できますが、net / rpc より処理速度が低下します。 net / rpc とは排他利用となっており、BoltzEngine を JSON-RPC モードで起動させた場合は他の関連サービス (BoltzMessenger, HTTP API Gateway) についても JSON-RPC モードで起動する必要があります。
HTTP API Gateway (http-proxy)
BoltzEngine の RPC API を REST の API として使用できるように動作するプロキシサービスです。 一般的な HTTP REST API として扱えるようになりますが、RPC 系 API よりも処理速度は低下します。また、追加でサービスを起動する必要があります。
CSV 入力コマンド
CSV に送信する通知を指定して一括で送信することができます。コマンドラインツールとして起動して CSV の内容を BoltzEngine 通知を登録します。バッチ処理等への組み込みに使用可能です。 速度は BoltzEngine の RPC インターフェイス (net / rpc もしくは JSON-RPC) に依存します。