この記事は Algolia の Software Engineer である Chloé Liban が書いた Ruby Client v2 is out! の翻訳記事になります。
Algoliaをご利用くださっている皆様にお知らせです: 私たちはAlgolia Ruby Clientの新しいmajor versionをリリースしました。Rubyクライアントは初期の頃にデザインされたものであることをご存知の方は多くないかもしれませんが、Version 1.1.3がリリースされたのは7年も前のことになります!Fresh airを吹き込ませるように、この新しいバージョンでは新しいデザインを取り入れ、Algoliaの標準APIクライアントの仕様に100%準拠するとともに、沢山の新しい機能が盛り込まれています。さぁ、それでは詳細を見ていきましょう。
Algoliasearch → Algolia になりました
お気づきになった方もいらっしゃるかもしれませんが、この度、gemの名前を変更させていただきました。私たちのRuby ClientはAlgoliaの様々な機能をカバーするため、複数のクライアントを提供することになりました: Search / Analytics / Insights / Recommendation。こちらの変更に伴いまして、新しいアーキテクチャを反映させるためシンプルに “algolia” という名前に変更させていただきました。
これによってREST API全体のポテンシャルを簡単に最大限に引き出すことが可能になります。やらなければならないことは使うクライアントごとにインスタンスを生成することのみで、あとはお客さま向けのエンドポイントを使うだけです。詳細は後述しますが、これらはより良い体験を提供するものであり、私たちのretry戦略の上に構築されているものになります。
モダンなツール群
今回の更新にあたって、私たちはRubyコミュニティのstate of the artなツールを用いることにしました。Rakeタスクはテストとリントをやりくりします。リンティングはRubocop、テストはMinitestによって実施されます。RspecではなくMinitestを採用した理由は単純で、並列でのテストが可能であるからです。JRubyと互換性があることが保証されていることで、マルチスレッドが正しく動作されているものを使いたいと思っていました。Minitestでは並列なテストが保証されており、全てがスムーズです。また、全てのメソッドのドキュメンテーションはYardの規約に沿っています。
Rubyのバージョンは2.2以降がサポートされています。こちらは今でも広く使われているバージョンとなっていて、Railsの前のバージョンであるv5でかろうじてサポートされていないバージョン(Rails5はRuby 2.2.2以降)となっています。
リトライ戦略
Algoliaのベストな体験を実現するロバストなクライアントを提供するために、Algoliaの他の全てのクライアントで用いられているものと同じリトライ戦略を実装しています。これはサービスの可用性を最大化するためにキーとなる要素で、別のクラスとして実装されているため、網羅的にユニットテストされ、それそのものがシステムとして動作するものとなっています。これはまた、全ての異なるクライアントのインスタンスでベネフィットを享受出来ることを意味し、たとえバンドルされているHTTPクライアントを使用しないという意思決定をしたとしても、このリトライ戦略を活用することができます。つまり、お好きなHTTPクライアントを自由にお使いいただけるということです。
DIYクライアント
このクライアントは簡単にカスタマイズすることができます。私たちがAPIクライアントを構築する上で最も重要視していることは信頼性とDX(Developer eXperience)です。私たちは、お客さまが安心してAlgoliaをご利用いただけるようにしたいと考えており、また、お客さまに快適に使えると実感していただきたいと思っています。そういった意味で、お客さまは私たちのrequesterやloggerをオーバーライドしてカスタマイズすることも出来ますし、私たちが提供するFaraday requesterを使うことを選択する場合も、それと共に用いるadapterをオーバーライドすることも出来るのです。これが私たちがFaradayを選んだ理由でもあります。実装することが楽しいだけでなく、ポピュラーで頻繁に更新されるため、私たちが提供しようとする柔軟性のニーズに応えてくれると言えるでしょう。デフォルトのアダプタはNet::HTTP::Persistentですが、お好みのHTTPライブラリ(Excon, HTTPClient, httpx等)に簡単に切り替えることが可能です。
Requestオプション
私たちはオプショナルなパラメータの管理をシンプルにしました。今では、メソッドのシグネチャで必須のパラメーターだけが期待され、それ以外は全てハッシュとして最後のオプショナルパラメーターで渡すことが出来るようになっています。もし、headers, timeout, connect_timeout, compression_typeといったパラメーターを渡したい場合は明示的に設定する必要がありますが、残りは全てas isのまま渡すことができます。これによってメソッドのシグネチャを短くし、他のPythonやPHPといった動的な型付け言語のクライアントとの整合性を保っています。
スタンドアロンの設定
私たちはコンフィギュレーション専用のクラスを追加しました。ここでは、timeouts, headers, そしてそれぞれのクライアント用の特定の設定を行うことができます。専用のクラスが追加されたことにより、簡単にtweakできるようになって、クライアント側で用途に応じてロジックを分離することができるようになりました。例えば、検索用の設定でデフォルトのホストを上書きすることが出来ます。
Search Client
Search Clientクラスはキレイになりました。設定を個別に扱えるようになったことに加えて、Protocolクラスを削除しました。これによって、mainクラスから直接ヒットしたエンドポイントをreadすることができるようになって、under the hoodで何が行われているかより理解しやすくなりました。最も重要なことは、これが singleton instance では無く、App IDとAPI Keyでクライアントを生成する、ということです。このインスタンスはrequesterとプールされたコネクションと共に実行されるため、同時に実行されている他のインスタンスに干渉することがありません。
Search Index
Search Indexクラスは、ほとんど変更されていません。上述したように、今回の主な改善点としては、全てのオプションパラメーターを一つのハッシュにまとめることで、メソッドのシグネチャを短くしたということにあります。これは非常に良い機能であるため、私たちはbang(!)メソッドを全てのオペレーションが終わるまで待つという用途のために残すことにしました。他のクライアントで用いられているような`wait()`メソッドをコールした後に使うことも出来ます。
TL;DR
私たちは今までのRubyクライアントでペインポイントであった 1. SearchクライアントのSingletonインスタンスと、2. Rubyクライアントが標準仕様に準拠していなかった、という2点を取り除きました。現在ではAlgoliaの標準およびRubyの標準にも準拠し、追加のユニットテストでCTSに沿うこともできるようになりました。私たちがv2を楽しく構築したのと同様に、皆さんがこの新しいバージョンのRubyクライアントを使って楽しんでくれることを願っております。もし、網羅的により詳細な変更点を知りたい場合は、アップグレードガイドをご参照ください。
コメント