マルチテナント型サービス特有の注意点
Force.comは前述のようにクラウドサービスです。クラウド上のコンピューターリソースを複数のユーザ企業で共有することによって、リソースの有効活用や運用コストの削減、バージョンアップの自動化などを実現する、「マルチテナント方式」を採用しています。
マルチテナント型クラウドサービスには良いところがたくさんある一方、オンプレミスにおける開発と大きく異なることがあります。それは、コンピューターリソースの利用に関する制限を守る必要があるという点です。Force.comの場合は「ガバナ制限(Governors and Limits)」と呼ばれ、例えば次のようなものがあります。なお、中には利用するエディションやユーザライセンス数によって上限が緩和されるものもあるので注意してください。
- 1回のトランザクションの中で実行できるクエリの回数制限
- 1回のトランザクションの中でクエリによって取得できるレコード数の制限
- 1回のトランザクションの中で実行できるApex文の数の制限
- 1回のリクエストの中で呼び出せるコールアウト(HTTPリクエストやWebサービス呼び出し)の回数の制限
- 非同期のメソッド呼び出しの回数の制限
ガバナ制限に配慮するという観点において、典型的な悪いコードは次のようなものです。
Account[] accounts = [SELECT Id, Name FROM Account];
Contact[] contacts = new List<Contact>();
for (Account account : accounts) {
contacts.addAll([SELECT Id, Name FROM Contact WHERE AccountId = :account.Id]);
}
このコードは、forループの中でクエリを発行してしまっているため、forループの繰り返し回数によって、クエリの発行回数のガバナ制限に違反してしまう恐れがあります。これを改善するためによくとられる方法は、WHERE句の条件を ‘=’(イコール )から’IN’に変更し、あらかじめListの中に格納しておいた複数の抽出条件を1回のクエリで指定する方法です。こうすることで、クエリの発行をforループの外に出すことができ、クエリの発行回数がforループの繰り返し回数に依存しないようになります。
Account[] accounts = [SELECT Id, Name FROM Account];
Set<Id> accountIds = new Set<Id>();
for (Account account : accounts) {
accountIds.add(account.Id);
}
Contact[] contacts = [SELECT Id, Name FROM Contact WHERE AccountId IN :accountIds];
このように、マルチテナント型クラウドサービスにおけるコーディングは、オンプレミスで開発する際とは一味違った価値観が求められます。ガバナ制限という制約の中でうまくやりくりすることや、新たなデザインパターンを発見することは、技術者としての腕の見せ所であり醍醐味です。さらには、少し視野を広げ、アーキテクチャの視点からシステムの別の使い方を提案する機会も多く得られるようになります。
日本が世界に誇る組み込みソフトウェアの技術力から推測できるように、日本人が厳しい制約を味方にできることは言うまでもありません。
まとめ
多くの基幹業務システムは、長年つぎはぎで機能追加されてきており、メンテナンスや機能追加のコストが高くなってしまっています。また、いくつものシステムがストーブパイプのように乱立することで、運用の手間を増加させ、ユーザ企業の情報システム部の勤務時間を占有していることも珍しくありません。こうしたシステムをForce.comで再構築することを思い浮かべてみてください。
主要な機能のうちのいくつかは、たったの数日間で、動くものをユーザ企業の担当者に見てもらうことができます。ユーザインターフェースは、プラットフォームによって全体的に統一され、まだ実装されていない他の機能が動くさまをイメージすることも容易です。画面の中での項目の配置や文言は、レビュー会議の中で即座に変更することができ、複雑なビジネスルールなど、より重要な問題に取り組む時間を増やすことができます。また、ポータルサイトのモバイルデバイスへの対応や、ソーシャル機能の追加といった技術トレンドの採用の早さは、これまで以上にユーザの興味が得られるため、プロジェクトに参加してもらえる時間が多くなる要因です。
社内にForce.comに詳しい専門家がいなくても、決してこの世の終わりではありません。Salesforce.com社が提供している充実したリソースや、世界中で80万人が参加するForce.comのコミュニティが助けになってくれます。また、みなさんが所属するコミュニティと、Force.comのコミュニティがさらに深くミックスされれば、面白い発想が次々と生まれ、ユーザがより便利に、安全に、楽しくなるに違いないのです。
ぜひ、この機会にForce.comプラットフォームを使ってみてください。そして、今後のより実践的な記事で腕に自信がついたと思ったら、CloudSpokesのようなクラウドソーシングの賞金にチャレンジしてみてはいかがでしょうか。次回からは、開発プロジェクトの流れに沿った形で、Force.comを実際に触っていきます。
