Skip to content

Latest commit

 

History

History
236 lines (175 loc) · 8.15 KB

20211213.md

File metadata and controls

236 lines (175 loc) · 8.15 KB

今週何知った? week:1

[name=makicamel]

Redis

Redis とは何か

インメモリ KVS データベース

特徴

  • ハイパフォーマンス
  • レプリケーション
  • KVS:Key-Value Store
  • 永続化

各社が提供する Redis 互換サービス

ゲームアプリやセッション・キャッシュの保存などスピードが求められる一時データが現在の主な用途だが、 Amazon MemoryDB for Redis が登場したことで永続化面でも用途が広がっていきそう

「複製」にまつわる用語

  • レプリケーション
    • 目的: 負荷分散、障害対策
    • 頻度: リアルタイム
  • シャーディング
    • 目的: 負荷分散
    • 頻度: リアルタイム
    • 説明: 水平分割。テーブルデータをレコード単位で複数のサーバに分散して保持する
  • バックアップ
    • 目的: データ復旧
    • 頻度: 低頻度。日に 1 度など

「処理能力向上」にまつわる用語

  • スケールアップ / スケールアウト
    • スケールアップ マシンの処理能力の向上
    • スケールアウト マシンの台数を増やし処理分散による全体としての処理能力の向上

Redis におけるシャード・ノード

  • ノード
    • Redis インスタンスを指す
    • マスターノード・レプリカノードがある
    • マスターノード
      • 0 個以上のレプリカノードを持つ
      • リアルタイムでスレーブノードにレプリケーションされる
    • スレーブノード
      • 読み取り専用
      • マスターノードが死んだ場合マスターノードに昇格する
  • シャード
    • ノード郡を指す。複数のマスター・レプリカノードを持つ
    • シャード内のノード間でデータがレプリケーションされる

各種データベース、キャッシュサーバーの機能の比較

Redis 入門 p.33

Redis のデータ構造

Redis 入門 p.36

  • STRING 文字列を数値としてインクリメント / デクリメントするためのコマンドなどもある Rails.cache でもサポートされている increment (ActiveSupport::Cache::MemCacheStore) - APIdock
  • LIST 右端・左端に値を追加 / 削除する、インデックスや範囲を指定して値をフェッチするほか、リストの中間に複数の要素を指定したりリストのサイズを任意の長さに指定したり(端から要素を捨てる)などができる
  • SET LIST と異なり順序が指定されない、一意な文字列となる。 このため値を指定して要素の追加 / 削除を行う
  • HASH 値が数値として解釈できる場合は値をインクリメント / デクリメントすることができる
  • ZSET キー(メンバー)と値(スコア)を持つ。 キーは一意であり、値(スコア)は浮動小数点数に限られる。 スコアは数値として順序を評価される。 ソートされた順序、スコアの値によってもアクセスできる。

[name=ken3ypa]

動機

あまり rake タスクを書いてこず、今の現場でrakeタスクの書き方について色々学んだのでまとめます

あらためて rake タスクってなに?

Better Make

  • Makeに影響を受けているので、RubyのMakeファイルでRake
  • 設定ファイルはMakefile、Rakefile

最小構成

# $ rake
# $ rake hogetask
task default: :hello

# $ rake
desc "hello"
task :hello do
  puts "Hello Rake!!"
end
require "bundler/gem_tasks"
require "rake/testtask"

Rake::TestTask.new(:test) do |t|
  t.libs << "test"
  t.libs << "lib"
  t.test_files = FileList["test/**/*_test.rb"]
end

task :default => [:rubocop, :test]

directory file という DSL がある...!!

HOGE = 'hoge'
directory HOGE

Prerequisites

指定のタスクが実行される前に、Prerequisites に指定したタスクを実行することが可能です。配列をとることができます

rakeタスク内でメソッドを作成する際の注意点と対応

rake task内でコンテクストが共有されてしまうので注意。各task内に書いてあると意図せずメソッドを上書きしてしまう可能性がある。そのため

  • 汎用的なものについては、task_helper.rb
  • その他のものについては refinements かPOROに切り出すとよい

thorとの比較

CLI作成ツール。 Rakeと比較して

  • 構造化しやすい。ネームスペースを class、module単位で分割可能。
    • rakeだとスコープを共有するので名前の競合がつらい
  • taskへ引数を渡しやすい
  • テストコードが書きやすい

environment

  • おまじない的に書いていたものの、意味を把握したい
  • rails環境で実行するという意味 eager_load するとかかな...?

descを指定するものは、実行されるタスクのみにする

単独で実行される予定のないタスクについては、descを付与しないようにしてもいいかもしれません。 rake -T で実行可能なrakeタスクを表示する際、単独実行されるタスクが表示されると誤解させてしまうのを防ぐ意味でメリットがあります。

rakeタスクに引数を渡す

引数を定義する

実行時にタスク名の引数として配列を渡す。各配列の要素に対してアクセサが定義され、タスク内で参照できるようになる

task :hoge, [:a, :b] do |task, args|
  p args.a
  p args.b
end

環境変数経由で渡す場合

key=value 形式で渡すことが出来る。渡した値は ENV['key'] で取り出し可能

rake hoge LOGIN_NAME=

渡した引数は ENV[

rakeタスクでテストを書く

Rakeタスクのテストが書きやすくなる

https://github.com/willnet/rake_shared_context

  include_context 'rake'

  subject { Rake.application.invoke_task('chart:check_to_exist_backups') }

RSpec

    allow(ENV).to receive(:[]).and_call_original
    allow(ENV).to receive(:[]).with('LOGIN_NAME') { login_name }
    allow(ENV).to receive(:[]).with('DEPARTMENT') { department_code }

and_call_original Mockではなく元のメソッドを呼べる

output + to_stderr

  context 'ログインネーム指定されていない場合' do
    let(:login_name) { '' }

    it 'エラーが発生し rake タスクの実行が中断される' do
      expect { subject }.to output("ユーザーが見つかりませんでした。\n").to_stderr
                        .and raise_error(SystemExit)
    end
  end

oneshot などの一回きりのrakeタスクを流し終えたら?

_archives などの階層の下に移動しておくと便利。 spec や rubocop などが不要に走らず節約できるため

階層整理

/lib/tasks 配下に置く

次回以降

  • 90 分にしてみよう
  • 15:00〜16:30
  • 日曜日(12/19)
  • やることは各自
  • メモはHackMD継続