こんにちは、STROBELIGHTSユニットの安藤です。
最近は広告運用ツールの開発・運用をやっていて、
業務の中で改善したいことがあり、Gemを作って公開しました。
先にどんなものを作ったかというと
MySQLのパーティションの操作をRubyから実行できるようにしました。
github.com
使い方はこんな感じです。
class DailyReport < ActiveRecord::Base include SimpleMySQLPartitioning partitioning_by :day, type: :range end partitions = [ ['p201808', '2018-09-01'] ] # パーティション追加 DailyReport.partition.add(partitions)
追加以外に、再構成、削除メソッドなどがあります。
背景
作るに至った経緯
- 複数のプロジェクトでのパーティション利用率が高い
- プロジェクトごとに似たコードが存在している
- どうせならGem化して公開してみたい
STROBELIGHTSでは、広告のプラットフォームごとに運用支援ツールを開発しており、
業務の中でレポートの集計テーブルを構築する機会があります。
ID, 日付を複合主キーに設定、パーティションを作成し、定期的にパーティションの再構成を実行する流れを組んでいます。
下記はほんの一部ですが、こんな感じのコードをlib以下に実装、executeメソッドに渡してResqueなどで、定期的にパーティションの追加(再構成)をしているイメージです。
# example "ALTER TABLE #{table_name} REORGANIZE PARTITION #{reorganize_partition} INTO ( PARTITION #{partition_1} VALUES LESS THAN ('#{value1}'), ..., PARTITION #{reorganize_partition} VALUES LESS THAN #{max_value} );"
複数プロジェクトでこの生SQLがあること自体、スマートじゃないなと思っていて、
むしろ、外だししたいと思ってました。
ソースコードの管理場所
個人のGitHubにしましたが(笑)、最初に管理方法をどうすべきか候補を出した上で、相談して決めました。
- 会社管理のGitHub NameSpace以下
- 社内のGitLab
- gem server立てる
- 個人のGitHub
1.は認証キーの管理上、却下
# Gemfile gem 'test_gem', git: 'https://user_name:認証キー@github.com:hogehoge/testgem.git', branch: 'master'
2.は開発環境でbundle packageを使い、本番環境でbundle install --local
3.は他の部署でもGem作ったりしているならありかなと思いましたが、今回は見送り。
結論
会社特有のビジネスロジックがあれば、2でそれがなく、他でも使えそうな内容であれば個人GitHubでRubyGemsに公開する方向にしました。
個人でのGitHubが一番楽です。
感想
複数プロジェクトでのパーティション追加の記述がなくなり、スッキリしました。
またREADMEのテンプレートを自動生成してくれたり、色々と手軽にGem公開できる仕組みが素晴らしいと感じました。
現状、レンジパーティションのみの対応で今後のUpdateは要検討です。
もし良かったら使ってみて下さい。 issueなども歓迎です。