SlideShare a Scribd company logo
1 of 32
Download to read offline
意外な相性!?
Azure Cosmos DB × LINE で作る
安心のメッセージ配信システム
平林 拓将(ひらりん)
himarin269 / himanago
LINE Developers Community REV UP 2021
2021/10/2
About me
• name: 平林 拓将(ひらりん)
• work: テクニカルトレーナー&開発
• award/title:
- Microsoft MVP for Azure(2019.11~)
- LINE API Expert(2020.3~)
• like:
- C# / serverless / cross-platform
• social:
- Twitter:@himarin269
- GitHub:himanago
- Blog:https://himanago.hatenablog.com/
今回お話しすること(25分)
• Azure Cosmos DB でメッセージ配信
• Microsoft Azure で使える NoSQL データベース
• 単なるデータベースとしてだけでなくメッセージ配信シ
ステムの中核として使える便利な機能を備えている
• LINE Messaging API と組み合わせることで簡単に
メッセージ配信システムを構築できる
• Azure Cosmos DB と LINE Messaging API の組み
合わせで実現できる「安心」のメッセージ配信システ
ムの構築例を紹介
• Cosmos DB・Messaging API 双方の比較的新しい機能
同士による「意外な相性」に注目!
LINE Botにメッセージ配信機能をつけたい!
たとえば…
• 友だち全員にブロードキャスト
• 一部の友だちにマルチキャスト/ナローキャスト
• 特定の友だちにプッシュ
Official Account Manager でもできるけど…
自前で作りたいこともしばしば
• Bot/システムの管理・運用をひとつにまとめたい
• 個別のチャットを自作してBotと併用したい
• Botとチャットは併用不可→
• 既存システムを拡張したい
• メール配信機能にLINEへの配信を追加したり
Messaging APIでできる
https://developers.line.biz/ja/docs/messaging-api/sending-messages/
※オーディエンス関連 API も使用できる
この配信と相性の良いAzureサービスがある
Messaging
API
Bot
?
Microsoft Azure LINE Platform
Azure Cosmos DB
Azure Cosmos DB の特徴
• マルチモデル/マルチ API なNoSQLデータベース
• コア(SQL), MongoDB, Cassandra, Azure Table,
Gremlin から選択
• 基本はドキュメント型のコア(SQL)
• Free Tier(無期限無料枠)あり
• サブスクリプションあたり1アカウントに適用可能
• 1000RU/秒・25GBが無料
• Change Feed による連携
今回注目するのはこれ!
Change Feed(変更フィード)
★ Azure Cosmos DB の変更フィードの設計パターン
https://docs.microsoft.com/ja-jp/azure/cosmos-db/change-feed-design-patterns
• データの変更があった場合にFunctionをトリガー
• 追加・変更に対応(順序保証あり)
Azure Functions
連携先は Azure Functions
• サーバーレスなコード実行環境
• さまざまな言語に対応
• 豊富なトリガー・入出力バインディングで実装が楽々
• 他のAzureサービスとの連携もコード記述量を削減できる
• HTTPトリガーが単体で動くため LINE Bot のバックエンド
に適している
• Change Feed で呼び出せる(Cosmos DB トリガー)
今回使うのはこれ
Cosmos DB × Functions × Messaging API
Bot
データ
登録
Change
Feed
DBに登録した内容をもとにして
メッセージを配信システムを構築!
メッセージ
配信
<構成イメージ>
Cosmos DB を用いるメリット
• Change Feed で構成がシンプルに
• イベントドリブンに実装できる
• コード実装量を大幅に削減できる
• データの書き込みと読み込みの処理を分離できる
• コマンド・クエリ責任分離パターン(CQRS)
• ドキュメント型のため Messaging API で送信する
メッセージの JSON をそのまま格納できる
• 好きな形式のメッセージJSONをDBに登録すれば
それが送られるという仕組みにできる
• DB登録内容がそのままメッセージ送信履歴になる
実装例(C#)
接続先情報
データはこの中に入っている
(複数件の可能性あり)
実装例(C#)
5個まで同時に送れるので
5件ずつ処理
JSON化
実装例(C#)
各APIを叩いてメッセージ送信
Cosmos DB × Functions の落とし穴
•API 呼び出しに失敗し関数の処理がそこで止まる
•Change Feedは実行されたことになる
• そのままでは再実行できない
• メッセージがロストしてしまう
•失敗したら再送信…を手作りしてもいいけど…
もしMessaging APIのサーバーが落ちていたら?
Azure Functions の再試行ポリシー
•正常に実行されるまでor最大回数まで再実行する
•再試行間隔は2種類から選べる
★ ドキュメント
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-error-pages
Preview
固定間隔 指定した時間が経過するたびに再試行
エクスポネンシャル
バックオフ
再試行間隔が施行のたび指数関数的に増えていく
(負荷軽減につながる)
実装例(C#) 15秒固定でリトライ
最大回数はなし
500番台で例外を投げ、
400番台でそのまま終了
実は本当に送信失敗したのか判断できない
タイムアウトしたように見えるが、
リクエストは正常に飛んでいて
ユーザーへの送信は行われていることがある
送信できているのにリトライしてしまえば、
同じメッセージがユーザーに
2度送られてしまうことに…
Messaging API の「リトライキー」
•プッシュ系の API で安全にリトライできるよう
にするための方法が提供されている
• 比較的最近の新機能(2020年5月)
•リクエストヘッダーに「X-Line-Retry-Key」
として16進表記のUUIDをセット
• 同じUUIDのリクエストを再送信とみなしてくれる
• すでに送信成功していればユーザーに送信されない
https://developers.line.biz/ja/docs/messaging-api/retrying-api-request/
通常のリトライ
https://developers.line.biz/ja/docs/messaging-api/retrying-api-request/
このとき送信が成功したことを
アプリ側で知ることができない
安全なリトライ方法
https://developers.line.biz/ja/docs/messaging-api/retrying-api-request/
同一のリトライキーで送った
メッセージはまだ送信成功
していないときのみ送信される!
エクスポネンシャルバックオフ
https://developers.line.biz/ja/docs/messaging-api/retrying-api-request/
Azure Functionsの再試行ポリシーで選択できる!
固定間隔 指定した時間が経過するたびに再試行
エクスポネンシャル
バックオフ
再試行間隔が施行のたび指数関数的に増えていく
(負荷軽減につながる)
実装例(C#) 最大回数なし・
最小4秒・
最大15分の
間隔で再実行
実装例(C#)
ヘッダーにリトライキーを追加
UUIDはCosmos DBのデータの
idがそのまま使える!
実際に試してみる(デモ)
メッセージ送信前後で5割失敗する
ダミーの例外発生処理を追加
↓
APIリクエストの失敗を再現
注意点
•これだけで放っておけるわけではないので、
監視のしくみ・体制はしっかりつくる
• Azure 側は Application Insightをみる
• Logic Apps 経由でメールやチャットツールへ通知
• Messaging API 等の障害状況も確認
• https://api.line-status.info/
• RSSフィード等が使えるため、Logic Appsで
更新を通知させることも
まとめ
• Cosmos DB・Functions は Messaging API の
プッシュ系機能と相性抜群
• 各サービス・APIの特徴と信頼性向上機能をよく確認
して組み合わせることで全体の信頼性が向上
• システムの監視も怠らず、利用者も運用者も安心でき
る構成にすることが大切
★サンプルコード
https://github.com/himanago/LineMessagingRetrySample

More Related Content

What's hot

What's hot (20)

Cognitive serviceのすゝめ
Cognitive serviceのすゝめCognitive serviceのすゝめ
Cognitive serviceのすゝめ
 
モバイル開発を便利にするAWS
モバイル開発を便利にするAWSモバイル開発を便利にするAWS
モバイル開発を便利にするAWS
 
Micronaut on Azure 試してみた
Micronaut on Azure 試してみたMicronaut on Azure 試してみた
Micronaut on Azure 試してみた
 
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築
 
Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築Azure Functionsでサーバーレスアプリケーション構築
Azure Functionsでサーバーレスアプリケーション構築
 
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポートJAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
 
くまあず平日夜の勉強会#4
くまあず平日夜の勉強会#4くまあず平日夜の勉強会#4
くまあず平日夜の勉強会#4
 
APIモック3分クッキング
APIモック3分クッキングAPIモック3分クッキング
APIモック3分クッキング
 
Ignite 2021秋 recap - 開発者向け新機能紹介
Ignite 2021秋 recap - 開発者向け新機能紹介Ignite 2021秋 recap - 開発者向け新機能紹介
Ignite 2021秋 recap - 開発者向け新機能紹介
 
Custom Vision APIの下準備
Custom Vision APIの下準備Custom Vision APIの下準備
Custom Vision APIの下準備
 
Media Assembly Kit
Media Assembly KitMedia Assembly Kit
Media Assembly Kit
 
CRM分析サービス crm analyzer expressを 支えるサーバレスな色々
CRM分析サービス  crm analyzer expressを 支えるサーバレスな色々CRM分析サービス  crm analyzer expressを 支えるサーバレスな色々
CRM分析サービス crm analyzer expressを 支えるサーバレスな色々
 
AWS Premier Night #1
AWS Premier Night #1AWS Premier Night #1
AWS Premier Night #1
 
20151102 jaws-ug ooita
20151102 jaws-ug ooita20151102 jaws-ug ooita
20151102 jaws-ug ooita
 
Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発Swaggerで始めるモデルファーストなAPI開発
Swaggerで始めるモデルファーストなAPI開発
 
NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影
NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影
NuxtJS + REST APIで運用中サービスをNuxtJS + GraphQLに変更したことによる光と影
 
AWS Black Belt Techシリーズ AWS Lambda Updates
AWS Black Belt Techシリーズ AWS Lambda UpdatesAWS Black Belt Techシリーズ AWS Lambda Updates
AWS Black Belt Techシリーズ AWS Lambda Updates
 
What is Serverless?
What is Serverless?What is Serverless?
What is Serverless?
 
30min serverless-x tuber
30min serverless-x tuber30min serverless-x tuber
30min serverless-x tuber
 
サーバーレスアーキテクチャで作るモバイルバックエンド
サーバーレスアーキテクチャで作るモバイルバックエンドサーバーレスアーキテクチャで作るモバイルバックエンド
サーバーレスアーキテクチャで作るモバイルバックエンド
 

Similar to 意外な相性!?Azure Cosmos DB × LINE で作る安心のメッセージ配信システム

Similar to 意外な相性!?Azure Cosmos DB × LINE で作る安心のメッセージ配信システム (20)

Azure × LINE でクラウドを楽しもう
Azure × LINE でクラウドを楽しもうAzure × LINE でクラウドを楽しもう
Azure × LINE でクラウドを楽しもう
 
LINE LIFF with Azure ハンズオン資料 - Azure サービス解説
LINE LIFF with Azure ハンズオン資料 - Azure サービス解説LINE LIFF with Azure ハンズオン資料 - Azure サービス解説
LINE LIFF with Azure ハンズオン資料 - Azure サービス解説
 
【de:code 2020】 Azure インフラ 最新アップデート!!
【de:code 2020】 Azure インフラ 最新アップデート!!【de:code 2020】 Azure インフラ 最新アップデート!!
【de:code 2020】 Azure インフラ 最新アップデート!!
 
【de:code 2020】 Azure インフラ 最新アップデート!!
【de:code 2020】 Azure インフラ 最新アップデート!!【de:code 2020】 Azure インフラ 最新アップデート!!
【de:code 2020】 Azure インフラ 最新アップデート!!
 
モバイルアプリ開発者にも知ってほしい Microsoft AzureのDatabase as a Service
モバイルアプリ開発者にも知ってほしい Microsoft AzureのDatabase as a Serviceモバイルアプリ開発者にも知ってほしい Microsoft AzureのDatabase as a Service
モバイルアプリ開発者にも知ってほしい Microsoft AzureのDatabase as a Service
 
Azure Cosmos DB のキホンと使いドコロ
Azure Cosmos DB のキホンと使いドコロAzure Cosmos DB のキホンと使いドコロ
Azure Cosmos DB のキホンと使いドコロ
 
Microsoft Build 2022をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPs
Microsoft Build 2022をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPsMicrosoft Build 2022をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPs
Microsoft Build 2022をさらに楽しむためのおすすめセッション/サンプル コード Powered by Microsoft MVPs
 
Serverless Architecture Overview #cdevc
Serverless Architecture Overview #cdevcServerless Architecture Overview #cdevc
Serverless Architecture Overview #cdevc
 
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
本格化するクラウド ネイティブに向けて進化する開発プラットフォームと .NET
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
Running Kubernetes on Azure
Running Kubernetes on AzureRunning Kubernetes on Azure
Running Kubernetes on Azure
 
Docker on azure!進化していくcontainerを覗いてみよう!
Docker on azure!進化していくcontainerを覗いてみよう! Docker on azure!進化していくcontainerを覗いてみよう!
Docker on azure!進化していくcontainerを覗いてみよう!
 
Start learning Azure Cosmos DB with Azure Synapse Link
Start learning Azure Cosmos DB with Azure Synapse LinkStart learning Azure Cosmos DB with Azure Synapse Link
Start learning Azure Cosmos DB with Azure Synapse Link
 
What's new with Serverless
What's new with ServerlessWhat's new with Serverless
What's new with Serverless
 
ASP.NET CoreとAzure AD B2Cを使ったサクっと認証
ASP.NET CoreとAzure AD B2Cを使ったサクっと認証ASP.NET CoreとAzure AD B2Cを使ったサクっと認証
ASP.NET CoreとAzure AD B2Cを使ったサクっと認証
 
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
【BS10】Microsoft と GitHub の開発エコシステムで、開発にドライブをかけよう!
 
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
Azure Cosmos DB Emulator on Docker を GitHub Codespaces で動かす!
 
Azure Synapse Link for Azure Cosmos DB
Azure Synapse Link for Azure Cosmos DBAzure Synapse Link for Azure Cosmos DB
Azure Synapse Link for Azure Cosmos DB
 
【de:code 2020】 Azure Cosmos DB - Build 2020 アップデート
【de:code 2020】 Azure Cosmos DB - Build 2020 アップデート【de:code 2020】 Azure Cosmos DB - Build 2020 アップデート
【de:code 2020】 Azure Cosmos DB - Build 2020 アップデート
 
Bot framework概要
Bot framework概要Bot framework概要
Bot framework概要
 

More from 拓将 平林

More from 拓将 平林 (11)

[Ignite The Tour Osaka] OPS20:インシデントに対応する (Respomding to incidents)
[Ignite The Tour Osaka] OPS20:インシデントに対応する (Respomding to incidents)[Ignite The Tour Osaka] OPS20:インシデントに対応する (Respomding to incidents)
[Ignite The Tour Osaka] OPS20:インシデントに対応する (Respomding to incidents)
 
JAZUG に参加してMicrosoft MVP になった話
JAZUG に参加してMicrosoft MVP になった話JAZUG に参加してMicrosoft MVP になった話
JAZUG に参加してMicrosoft MVP になった話
 
Clova「おしゃべり禁止モード」
Clova「おしゃべり禁止モード」Clova「おしゃべり禁止モード」
Clova「おしゃべり禁止モード」
 
Xamarin.Forms with VUI(JXUG 2019/8/31)
Xamarin.Forms with VUI(JXUG 2019/8/31)Xamarin.Forms with VUI(JXUG 2019/8/31)
Xamarin.Forms with VUI(JXUG 2019/8/31)
 
【朗報】無音無限ループは禁術じゃなかった!
【朗報】無音無限ループは禁術じゃなかった!【朗報】無音無限ループは禁術じゃなかった!
【朗報】無音無限ループは禁術じゃなかった!
 
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
Azureのサーバーレスで限界を超えよう~スマートスピーカースキル開発を題材に~
 
Bot Serviceだけじゃない!Azureで加速させるLINE開発~Clova腹話術スキルの紹介~
Bot Serviceだけじゃない!Azureで加速させるLINE開発~Clova腹話術スキルの紹介~Bot Serviceだけじゃない!Azureで加速させるLINE開発~Clova腹話術スキルの紹介~
Bot Serviceだけじゃない!Azureで加速させるLINE開発~Clova腹話術スキルの紹介~
 
Clova腹話術スキルの紹介
Clova腹話術スキルの紹介Clova腹話術スキルの紹介
Clova腹話術スキルの紹介
 
Azure&C#によるClovaスキル+LINE Bot短期開発
Azure&C#によるClovaスキル+LINE Bot短期開発Azure&C#によるClovaスキル+LINE Bot短期開発
Azure&C#によるClovaスキル+LINE Bot短期開発
 
[JAZUG 7周年総会]社内でIoT&AIな農業系チャットボット開発講座をやってみて
[JAZUG 7周年総会]社内でIoT&AIな農業系チャットボット開発講座をやってみて[JAZUG 7周年総会]社内でIoT&AIな農業系チャットボット開発講座をやってみて
[JAZUG 7周年総会]社内でIoT&AIな農業系チャットボット開発講座をやってみて
 
最近Azure上でXamarinを触り始めた話
最近Azure上でXamarinを触り始めた話最近Azure上でXamarinを触り始めた話
最近Azure上でXamarinを触り始めた話
 

意外な相性!?Azure Cosmos DB × LINE で作る安心のメッセージ配信システム