なぜconnection pool必要?
- connectionの数が無限ではない、例えば、mysql、Redis、Http serverなどがサポートするMax connectionがある
- リソースを作成するのに時間がかかる。例えば、毎回新しいDB connection、websocketを作成するとパフォーマンス低下になります。
connection poolの仕組みを紹介する面白い記事
connection poolの活用例
- よく使うのはdatabase connection pool
- web serviceの制限で、同時サポートできるconnection数が限られている場合
Generic connection pooling for Rubyを調べる
- 特徴: 汎用的に、何でもpoolで管理できる
- connection pool実装するときに押さえるべきポイント
- lockが必要:複数のところで同時にconnection poolからconnectionを取ったり、戻したりするときに、競合が発生しないように、lockが必要
- timeoutが必要:connectionの取り出しで、connection poolが使い切った場合、一定の時間を待て、諦める
なぜ分散connection pool必要?
複数processや、分散サーバで処理を実行するときも、同じpoolを共有することができない
解決案を探る
- まず分散処理でも使えるlockが必要で、このredlock-rb gemを発見
- poolのサイズを管理する必要があるので、redisを使うと分散処理で、同じ情報を参照することができる
分散connection poolを実装して見ました
初期版はここ:https://github.com/qiuyin/connection_pool
表のConnectionPoolクラスは基本そのままで、分散queueを追加して、分散connection poolを実現しました。
新規に追加した分散queue: lib/connection_pool/distributed_sized_queue.rb