重複プッシュ通知を回避する方法:CID機能徹底解説
プッシュ通知システムにおいて、重複プッシュは一般的な問題であり、特にネットワークが不安定な場合やシステムのリトライ時に顕著です。本記事では Client ID(CID)機能を深掘りし、この仕組みを活用してメッセージの重複配信を効果的に防ぐ方法を解説します。
即時プッシュにおける CID 機能
コア特性
CID はプッシュリクエストを一意に識別するためのオプションパラメータです。同じ CID でリクエストを繰り返すと:
- システムは前回成功したプッシュの
msg_id
を返します - ユーザーへのメッセージ重複配信を防止
- 冪等性保証(同じ操作を複数回実行しても結果は同じ)
主要属性
特性 | 説明 |
---|---|
有効期間 | 1時間 |
フォーマット要件 | 英字、数字、アンダースコア、ハイフンで構成、長さ ≤ 64文字 |
ユニーク性 | 同一 appkey 内で一意であること |
対応シーン | 単一プッシュ・バッチプッシュ両方に対応 |
適用シーン
- ネットワークリトライ:ネットワーク不安定時に同じ CID で再送
- 冪等性保証:同一メッセージの重複配信防止
- リクエストトラッキング:CID で特定プッシュの状態追跡
リクエスト例
単一プッシュで CID を付与
curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push \
-H "Content-Type: application/json" \
-u "AppKey:MasterSecret" \
-d '{
"options": {
"cid": "order-notify-20230701-001",
"time_to_live": 60
}
}'
curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push \
-H "Content-Type: application/json" \
-u "AppKey:MasterSecret" \
-d '{
"options": {
"cid": "order-notify-20230701-001",
"time_to_live": 60
}
}'
このコードブロックはフローティングウィンドウ内に表示されます
バッチプッシュで CID を付与
curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push/batch/regid \
-H "Content-Type: application/json" \
-u "AppKey:MasterSecret" \
-d '{
"requests": [
{
"options": {
"cid": "user-12345-notification",
"time_to_live": 60
}
}
]
}'
curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/push/batch/regid \
-H "Content-Type: application/json" \
-u "AppKey:MasterSecret" \
-d '{
"requests": [
{
"options": {
"cid": "user-12345-notification",
"time_to_live": 60
}
}
]
}'
このコードブロックはフローティングウィンドウ内に表示されます
レスポンス処理
初回プッシュ成功時
{
"msg_id": "2460001"
}
{
"msg_id": "2460001"
}
このコードブロックはフローティングウィンドウ内に表示されます
同じ CID で重複プッシュ
{
"msg_id": "2460001" // 初回プッシュの msg_id を返却
}
{
"msg_id": "2460001" // 初回プッシュの msg_id を返却
}
このコードブロックはフローティングウィンドウ内に表示されます
CID フォーマット不正
{
"error": {
"code": 23003,
"message": "CID format does not meet requirements"
}
}
{
"error": {
"code": 23003,
"message": "CID format does not meet requirements"
}
}
このコードブロックはフローティングウィンドウ内に表示されます
エラーコード説明
エラーコード | 説明 | 解決方法 | HTTP ステータス |
---|---|---|---|
21003 | CID フォーマット不正または長すぎる | CID フォーマットと長さ(64文字以内)を確認 | 400 |
ベストプラクティス
- 重要業務には CID を利用:決済通知や重要アラート等は必ず CID を付与
- 意味のある識別子を生成:
businessType-userID-timestamp
(例:payment-12345-202307011030
) - ネットワークリトライ時も同じ CID を利用
- バッチプッシュは CID で個別識別:各リクエストに異なる CID を付与し追跡性向上
- クライアントで CID を記録:メッセージ重複排除や状態確認に活用
スケジュールタスクにおける CID 機能
コア特性
CID はスケジュールタスク作成時にも利用でき、同一タスクの重複作成を防止します:
- 同じ CID で再作成すると、既存の
schedule_id
を返却 - システムによる重複タスク作成を防ぐ
主要属性
特性 | 説明 |
---|---|
有効期間 | 1時間 |
フォーマット要件 | 英字、数字、アンダースコア、ハイフンで構成、長さ ≤ 64文字 |
ユニーク性 | 同一 appkey 内で一意であること |
リクエスト例
curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/schedules \
-H "Content-Type: application/json" \
-u "AppKey:MasterSecret" \
-d '{
"cid": "daily-reminder-202307",
"trigger": {
"daily": {
"start": "2023-07-01",
"time": "09:00:00"
}
}
}'
curl --insecure -X POST -v https://pushapi-sgp.engagelab.com/v4/schedules \
-H "Content-Type: application/json" \
-u "AppKey:MasterSecret" \
-d '{
"cid": "daily-reminder-202307",
"trigger": {
"daily": {
"start": "2023-07-01",
"time": "09:00:00"
}
}
}'
このコードブロックはフローティングウィンドウ内に表示されます
レスポンス処理
初回作成成功時
{
"schedule_id": "0123456789"
}
{
"schedule_id": "0123456789"
}
このコードブロックはフローティングウィンドウ内に表示されます
同じ CID で重複作成
{
"schedule_id": "0123456789" // 初回作成の schedule_id を返却
}
{
"schedule_id": "0123456789" // 初回作成の schedule_id を返却
}
このコードブロックはフローティングウィンドウ内に表示されます
ベストプラクティス
- 周期タスク識別:CID に周期情報を付与(例:
weekly-report-2023w27
) - タスクパラメータ要約:CID に主要パラメータのハッシュ値を含める(例:
birthday-reminder-md5(params)
) - 分散システム協調:複数サービス間で同じ CID を利用し重複作成防止
- タスク更新時は新しい CID を利用
EngageLab の処理フロー
graph TD A[リクエスト受信] --> B{CID あり?} B -->|Yes| C[Redis を照会] B -->|No| D[通常処理] C --> E{CID 存在?} E -->|Yes| F[保存済みの msg_id/schedule_id を返却] E -->|No| G[リクエスト処理] G --> H[CID → ID マッピング保存] H --> I[新しい ID を返却]
よくある質問
Q: CID の有効期間が 1 時間なのはなぜ?
A: 通常のリトライシナリオをカバーしつつ、無制限なストレージ増加を防ぐためです。重要業務の場合は独自ログで重複排除期間を延長可能です。
Q: 異なる appkey で同じ CID は使える?
A: 可能です。CID は同一 appkey 内でのみ一意であれば十分です。
Q: CID はグローバルに一意である必要がある?
A: 必要ありません。同一 appkey 内で一意であれば問題ありません。
Q: CID のフォーマット検証方法は?
A: 正規表現:/^[a-zA-Z0-9_-]{1,64}$/
を利用してください。
まとめ
CID パラメータを正しく利用することで、以下が実現できます:
- ✅ ネットワークリトライによるメッセージ重複配信の防止
- ✅ 重要業務メッセージの冪等性保証
- ✅ 分散システムでのメッセージ追跡簡素化
- ✅ システム全体の信頼性向上
実装上の重要ポイント:
- 重要業務メッセージには必ず CID を付与
business-entity-time
命名規則を推奨- クライアントで CID ベースの重複排除ロジックを実装
- CID 関連エラーコードに注意
本ガイドを活用し、CID 機能を最大限に活かすことで、より堅牢なプッシュ通知システムを構築し、重複プッシュ問題を根本から解決しましょう。