SlideShare ist ein Scribd-Unternehmen logo
1 von 41
ota42y
2018/08/30
microservice meetup 8
マイクロサービスにおける
結果整合性との戦い
• ota42y
• サーバサイドエンジニア
• rubyとかrustとかgoとかC++とか
• Twitter、github → ota42y
• 最近はサーバレスしたりGPUで遊んだり
ElasticSerachしたり色々…
自己紹介
• 技術書典4でマイクロサービス本を出した
– https://ota42y.com/blog/2018/04/10/mi
croservices_yorozu_book/
– 技術書典5で続きを出します
自己紹介
• 今回は次の本で書く内容のチラ見せ
– (訳: あとでちゃんとしたのを本にします…)
自己紹介
結果整合性
• Eventual Consistency
• 途中では整合性が崩れた状態に陥るが、
十分な時間がたったら最終的には整合
性がとれた状態になる
• 分散システムのBASEで語られる
• ACIDと対比されやすい概念
• ACIDは常に一貫した状態を保証する
結果整合性
• Eventual Consistency
• 途中では整合性が崩れた状態に陥るが、
十分な時間がたったら最終的には整合
性がとれた状態になる
• 分散システムのBASEで語られる
• ACIDと対比されやすい概念
• ACIDは常に一貫した状態を保証する
• マイクロサービスアーキテクチャは分散
システムの一種
結果整合性
イベントドリブンアーキテクチャ
• イベントベースで情報をやりとりするアーキテクチャ
• 送り手はイベントを起こすだけで受け手を知らない
• 受け手はイベントの監視だけで送り手を知らない
• 疎結合に組める
• 詳しくは過去の発表資料を…
• マイクロサービスにおける 非同期アーキテクチ
• https://www.slideshare.net/ota42y/ss-
80254350
• Rails DMの動画も公開されました
• https://www.youtube.com/watch?v=amsQa
PIajqs
イベントドリブンアーキテクチャ
イベントドリブンアーキテクチャ
• トランザクションが必要なデータは発行もとで完結
• 購読者がそれを見て処理を行う
• 部分的には正しくない状態が起きる
• Lifelogで投稿したのにPointが”まだ”付いてない
イベントドリブンアーキテクチャ
• トランザクションが必要なデータは発行もとで完結
• 購読者がそれを見て処理を行う
• 部分的には正しくない状態が起きる
• Lifelogで投稿したのにPointが”まだ”付いてない
• 十分な時間がたてば各マイクロサービスのデータが
正しくなる
• 結果整合性
結果整合性を担保する
DBに保存
SNSにイベント送信
結果整合性を担保する
結果整合性を担保する
• ほかサービスへの送信に失敗した場合
Lifelog Ranking
ここで失敗
結果整合性を担保する
結果整合性を担保する
• リトライするべきかしないべきか
Lifelog Ranking
Lifelog Ranking
結果整合性を担保する
• リトライするべきかしないべきか
• リトライすると
• 送信に成功して結果を受け取れなかった場合に二重
に送ってしまう
data
data再送するよ〜
すでに処理済み…
結果整合性を担保する
• リトライするべきかしないべきか
• リトライしないと
• 送信自体に失敗した場合に整合性が合わなくなる
Lifelog Ranking
data
結果整合性を担保する
• リトライ可否を調べる場合
• 他のサービスのロジックを送り手側が把握しないと
いけない
• 受け手側も全ての部分で状態を調べ上げる必要性
Lifelog Ranking
data
Service B
Service A
結果整合性を担保する
• 送り手側が適切にリトライ処理を行うのは無理
• マイクロサービスの都合を全部把握するのは無理
• 受け手側でリトライされていても大丈夫に作るべき
• 何度実行されても大丈夫なようにする
• 冪等性
• 防御的なアプローチ
つらい…
冪等性
• 元々は数学用語
• 情報工学においては
• 何度同じ操作を行っても同じ結果になるもの
• data.append(1)
• 冪等ではない
• dataの要素が常に1づつ増えていく
• data.size
• 冪等
• data[0] = 1
• これも冪等
冪等性
冪等性万歳
• 同じデータでリトライしても大丈夫になる
• 失敗したら成功するまで常にリトライすれば良くなる
event
event
event
event
再送するよ〜
すでに処理中だけど2通目は無視
(o゜▽゜)
そう上手くはいかない
どうやって冪等性を担保するの?
ユーザの投稿(Post)にはデータとして冪等にするた
めのキーはない
関係ないカラムを加えるのはしたくない
ここで失敗
部分的なリトライ
transactionの外なのでロールバックされない
外から見たら失敗なので再実行する
失敗部分だけ再実行したいのにデータが増える
あらゆる所で保証する必要がある
• 冪等性に頼ってとりあえずリトライする方針
• 冪等でない場所があると整合性が崩れる
event
event
event
event
こっちは冪等
ここは冪等じゃないので…
event
とりあえず再送!
あらゆる所で保証する必要がある
• 冪等性に頼ってとりあえずリトライする方針
• 冪等でない場所があると整合性が崩れる
• 多段になってるとマジヤバイ
• 気軽に冪等にできないとつらい
event
event
event
event
event
event
event
event
つらいわ…
とりあえずの解決策
• idempotent_transaction
• https://github.com/ota42y/idempotent_transac
tion
• Unique keyを使って冪等性を担保する
とりあえずの解決策
• やってることは簡単
• Unique Keyを持ったテーブルと一緒にトランザク
ションしているだけ
• 任意のテーブルに冪統制を簡単に紐付けられる
• Unique Indexを工夫すればパフォーマンスは大丈夫
…Aurora様なら…
とりあえずの解決策
ここの間は1回しか保存されない
ここは何度も実行されるが
受け手側で冪等になればOK
未解決の問題が
• 実行したかどうかをDBに保存している
• selectが純粋に1回増える
• Indexは効くが数が増えるとDBが辛そう
• redisにキャッシュすると今度はトランザクションと
状態を合わせるのがつらい
• ロールバックorコミット中にredisが死んだら…
• そもそもまだ整合性を担保できてない
• 非同期処理の順序問題…
• 結果整合性を受け手が満たせない場合どうすんの?
• サーバ超えてトランザクション維持したいときあるよね
• 技術書典5のマイクロサービス本に書く
– https://ota42y.com/blog/2018/04/10/mi
croservices_yorozu_book/
– たぶん書きます…たぶん…
このへんの話

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 
なぜ「マイクロサービス“化”」が必要なのか
なぜ「マイクロサービス“化”」が必要なのかなぜ「マイクロサービス“化”」が必要なのか
なぜ「マイクロサービス“化”」が必要なのか
 

Ähnlich wie マイクロサービスにおける 結果整合性との戦い

130427 kansai-emacs-github
130427 kansai-emacs-github130427 kansai-emacs-github
130427 kansai-emacs-github
Yuki Shibazaki
 
Cloud principles and paradigms kimtea-2010-04-24
Cloud principles and paradigms kimtea-2010-04-24Cloud principles and paradigms kimtea-2010-04-24
Cloud principles and paradigms kimtea-2010-04-24
Kazuki Aranami
 

Ähnlich wie マイクロサービスにおける 結果整合性との戦い (20)

なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話
 
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
 
Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点
 
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱いRails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
 
Micronaut on Azure 試してみた
Micronaut on Azure 試してみたMicronaut on Azure 試してみた
Micronaut on Azure 試してみた
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
130427 kansai-emacs-github
130427 kansai-emacs-github130427 kansai-emacs-github
130427 kansai-emacs-github
 
goroutineはどうやって動いているのか
goroutineはどうやって動いているのかgoroutineはどうやって動いているのか
goroutineはどうやって動いているのか
 
新・ReVIEWパーサについて
新・ReVIEWパーサについて新・ReVIEWパーサについて
新・ReVIEWパーサについて
 
Cloud principles and paradigms kimtea-2010-04-24
Cloud principles and paradigms kimtea-2010-04-24Cloud principles and paradigms kimtea-2010-04-24
Cloud principles and paradigms kimtea-2010-04-24
 
What's Cooking In Ruby 2.7
What's Cooking In Ruby 2.7What's Cooking In Ruby 2.7
What's Cooking In Ruby 2.7
 
Mrubyの始め方
Mrubyの始め方Mrubyの始め方
Mrubyの始め方
 
gitその2 rebaseとrebase -iを理解してgit-flowをやりやすくする
gitその2 rebaseとrebase -iを理解してgit-flowをやりやすくするgitその2 rebaseとrebase -iを理解してgit-flowをやりやすくする
gitその2 rebaseとrebase -iを理解してgit-flowをやりやすくする
 
SAIS/SIGMOD参加報告 in SAIS/DWS2018報告会@Yahoo! JAPAN
SAIS/SIGMOD参加報告 in SAIS/DWS2018報告会@Yahoo! JAPANSAIS/SIGMOD参加報告 in SAIS/DWS2018報告会@Yahoo! JAPAN
SAIS/SIGMOD参加報告 in SAIS/DWS2018報告会@Yahoo! JAPAN
 
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
 
チケット管理システム大決戦第二弾
チケット管理システム大決戦第二弾チケット管理システム大決戦第二弾
チケット管理システム大決戦第二弾
 
Azure Cloud Shell
Azure Cloud ShellAzure Cloud Shell
Azure Cloud Shell
 
Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告
 
ServerlessとMicroserviceの難しさに立ち向かう
ServerlessとMicroserviceの難しさに立ち向かうServerlessとMicroserviceの難しさに立ち向かう
ServerlessとMicroserviceの難しさに立ち向かう
 
深層学習ライブラリのプログラミングモデル
深層学習ライブラリのプログラミングモデル深層学習ライブラリのプログラミングモデル
深層学習ライブラリのプログラミングモデル
 

Mehr von ota42y (7)

bootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのかbootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのか
 
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説
 
FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方
 
CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説
 
prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話
 
身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る
 
HCI分野の紹介と最新研究
HCI分野の紹介と最新研究HCI分野の紹介と最新研究
HCI分野の紹介と最新研究
 

マイクロサービスにおける 結果整合性との戦い

Hinweis der Redaktion

  1. この中に、マイクロサービスアーキテクチャを知ってる人どれくらいいますか? ありがとうございます、以外と少なくて資料作った会がありました…