SlideShare uma empresa Scribd logo
1 de 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/
– たぶん書きます…たぶん…
このへんの話

Mais conteúdo relacionado

Mais procurados

Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 

Mais procurados (20)

それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
 
Apache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once SemanticsApache Kafka 0.11 の Exactly Once Semantics
Apache Kafka 0.11 の Exactly Once Semantics
 
マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 

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

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
 

Semelhante a マイクロサービスにおける 結果整合性との戦い (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の難しさに立ち向かう
 

Mais de 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分野の紹介と最新研究
 

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

Notas do Editor

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