Slide 1

Slide 1 text

キャッシュ安心戦略 with Feature Toggles Oct 31, 2018 @tooooooooomy ebisurb

Slide 2

Slide 2 text

2 突然ですが、みなさん

Slide 3

Slide 3 text

3 こんなキャッシュ見たことないですか?

Slide 4

Slide 4 text

4 こんなキャッシュ見たことないですか?

Slide 5

Slide 5 text

5 こんなキャッシュ見たことないですか?

Slide 6

Slide 6 text

6 何が危険なのか?

Slide 7

Slide 7 text

7 何が危険なのか? ● オブジェクトがキャッシュされている

Slide 8

Slide 8 text

8 何が危険なのか? ● オブジェクトがキャッシュされている ○ 暗黙のSerialize/Deserializeが発生 ○ Rails公式でもキャッシュにはrawデータ(a string or number)を用いることがmustとされている ■ https://guides.rubyonrails.org/v4.2.8/caching_with_rails.html#activesupport-cache-memcachestore

Slide 9

Slide 9 text

9 何が危険なのか? ● オブジェクトがキャッシュされている ○ 暗黙のSerialize/Deserializeが発生 ○ Rails公式でもキャッシュにはrawデータ(a string or number)を用いることがmustとされている ■ https://guides.rubyonrails.org/v4.2.8/caching_with_rails.html#activesupport-cache-memcachestore ● なぜ危険なのか?

Slide 10

Slide 10 text

10 何が危険なのか? ● オブジェクトがキャッシュされている ○ 暗黙のSerialize/Deserializeが発生 ○ Rails公式でもキャッシュにはrawデータ(a string or number)を用いることがmustとされている ■ https://guides.rubyonrails.org/v4.2.8/caching_with_rails.html#activesupport-cache-memcachestore ● なぜ危険なのか? ○ 異なるサービス間・同じサービスの過去の実装と現在の実装間で共有される ■ データ(キャッシュ)自体が実装に強く依存している状態 ■ Ruby(Rails)以外の実装のアプリケーションとは共有できない ● もしくは明示的な実装が必要 ■ 不具合があってロールバックすると整合性が取れないという状況が起こりうる ● 例) キャッシュ対象のオブジェクトのクラス名が変わる

Slide 11

Slide 11 text

11 やばい

Slide 12

Slide 12 text

12 安心のために ● 外部データの保存形式を、後方互換性を担保したものに変更する

Slide 13

Slide 13 text

13 安心のために ● 外部データの保存形式を、後方互換性を担保したものに変更する ○ 例) JSON

Slide 14

Slide 14 text

14 安心のために ● 外部データの保存形式を、後方互換性を担保したものに変更する ○ 例) JSON

Slide 15

Slide 15 text

15 安心

Slide 16

Slide 16 text

16 さっそく置き換えだ!

Slide 17

Slide 17 text

17 ちょっと待って!

Slide 18

Slide 18 text

18 そのキャッシュ、本当に必要?

Slide 19

Slide 19 text

19 まず確認しよう!

Slide 20

Slide 20 text

20 まず確認しよう!

Slide 21

Slide 21 text

21 まず確認しよう! ● 何回呼ばれたか

Slide 22

Slide 22 text

22 まず確認しよう! ● 何回呼ばれたか ● うち何回キャッシュが新たに作られたか ○ キャッシュ使用率

Slide 23

Slide 23 text

23 まず確認しよう! ● 何回呼ばれたか ● うち何回キャッシュが新たに作られたか ○ キャッシュ使用率 ● 複数のプロセスから呼ばれることが想定さ れる場合、Redisのincrが便利 ○ そもそもRedisがバックエンドの場合はそれを利 用するとよさげ ○ 整合性を持ってカウントアップ

Slide 24

Slide 24 text

24 それでも必要なら・・・

Slide 25

Slide 25 text

25 新キャッシュを導入しよう!

Slide 26

Slide 26 text

26 Q. いきなり新しいキャッシュに置き換えてうまく動くのか不安です

Slide 27

Slide 27 text

27 Q. いきなり新しいキャッシュに置き換えてうまく動くのか不安です A. Feature Toggles を使おう

Slide 28

Slide 28 text

28 Feature Toggles? ● Feature Toggles (aka Feature Flags) ● "Feature Toggling" is a set of patterns which can help a team to deliver new functionality to users rapidly but safely. ● 「1%の確率でtrueを返す」のような設定を可能にするもの

Slide 29

Slide 29 text

29 Feature Toggles使用例(実装は省きます)

Slide 30

Slide 30 text

30 Feature Toggles使用例(実装は省きます)

Slide 31

Slide 31 text

31 Feature Toggles使用例(実装は省きます) ● シンプルにif文にするだけ

Slide 32

Slide 32 text

32 Feature Toggles使用例(実装は省きます) ● シンプルにif文にするだけ ● 簡単安心 ○ どんな場合にtrueを返すかは実装によります

Slide 33

Slide 33 text

33 Feature Togglesで安心のリリース

Slide 34

Slide 34 text

34 実際のフロー

Slide 35

Slide 35 text

35 実際のフロー 1. 追加で新キャッシュ作るだけの変更をデプロイ ● 古いキャッシュは作り続ける

Slide 36

Slide 36 text

36 実際のフロー 1. 追加で新キャッシュ作るだけの変更をデプロイ ● 古いキャッシュは作り続ける 2. 実際にキャッシュ作る箇所をFeature Toggles入りでデプロイ

Slide 37

Slide 37 text

37 実際のフロー 1. 追加で新キャッシュ作るだけの変更をデプロイ ● 古いキャッシュは作り続ける 2. 実際にキャッシュ作る箇所をFeature Toggles入りでデプロイ 3. Feature Togglesで1%リリース

Slide 38

Slide 38 text

38 実際のフロー 1. 追加で新キャッシュ作るだけの変更をデプロイ ● 古いキャッシュは作り続ける 2. 実際にキャッシュ作る箇所をFeature Toggles入りでデプロイ 3. Feature Togglesで1%リリース 4. 100%!!!(任意の時間を置く)

Slide 39

Slide 39 text

39 実際のフロー 1. 追加で新キャッシュ作るだけの変更をデプロイ ● 古いキャッシュは作り続ける 2. 実際にキャッシュ作る箇所をFeature Toggles入りでデプロイ 3. Feature Togglesで1%リリース 4. 100%!!!(任意の時間を置く) 5. 古いキャッシュ生成をやめる変更をデプロイ

Slide 40

Slide 40 text

40 実際のフロー 1. 追加で新キャッシュ作るだけの変更をデプロイ ● 古いキャッシュは作り続ける 2. 実際にキャッシュ作る箇所をFeature Toggles入りでデプロイ 3. Feature Togglesで1%リリース 4. 100%!!!(任意の時間を置く) 5. 古いキャッシュ生成をやめる変更をデプロイ レビュワーも流れに沿って変更を追えて安心 特に変更が多い場合には少しずつリリースすると安心

Slide 41

Slide 41 text

41 実際の様子(1キャッシュを置き換えるときのIssue)

Slide 42

Slide 42 text

42 実際の様子(1キャッシュを置き換えるときのIssue) ● 最小限の変更を細かく重ねる ● 安心な置き換え

Slide 43

Slide 43 text

43 安心

Slide 44

Slide 44 text

44 Who am I? twitter: @toooooooomy github: @kazu9su Software Engineer 楽天株式会社ラクマ事業部 ラクマでは安心好きな仲間を募集中です

Slide 45

Slide 45 text

Thank you for your attention!