RAM不足にさよなら:Evolution Goで始める軽量WhatsApp連携
WhatsAppをCRMに接続したり、通知サービスを構築したことのある人なら、リソース問題に見舞われた経験があるのではないでしょうか。市販のオープンソースソリューションの多くは、BaileysのようなJavaScriptライブラリてんこ盛りだったり、ヘッドレスのPuppeteerブラウザを動かしていたりと、無駄に重いものがほとんどです。こんな環境では、数百のアクティブインスタンスが簡単に数十GBのRAMを消費してしまいます。
Evolution Foundationの開発者もまさにこの問題に当たりました。彼らのメインプロジェクトであるEvolution APIはNode.jsで書かれており、大半のタスクには最適です。しかし、スケーリングが必要になった段階で、コアエンジンをGoで書き直すことを決意しました。
こうして生まれたのがevolution-go——whatsmeowライブラリをクリーンなREST APIでラップしたサービス」です。

プロジェクトの内部構造
このサービスのコアにはWhatsAppプロトコル対応のGoライブラリであるwhatsmeowがあります。その上にHTTPリクエストを処理するGin Webフレームワークと、ドキュメント生成用のSwaggerが乗っています。
このサービスのメインコンセプトは、ローレベルのソケット処理、セッション管理、QRコード認証、メディア配送などをすべて自前で担うことです。通常のHTTP POSTリクエストでJSONを送信すれば、残りの処理はサービスが面倒を見ます。
アーキテクチャの注目ポイント
着信イベントの配信に対するアプローチが興味深いです。多くの場合、このようなサービスはWebhookにしか対応していませんが、ここでは選択肢が豊富です:
- シンプルな連携向けWebhook
- リアルタイムインターフェース向けWebSocket
- 分散システム向けの信頼性の高いキューであるRabbitMQ(AMQP)とNATS
クライアントが画像、音声メッセージ、ドキュメントの送受信を行う場合、evolution-goはそれらを直接S3やMinIOにアップロードできます。すべてのテキスト履歴と接続ステータスは、必要に応じてGORM経由でPostgreSQLに保存されます。
実際の動作
プロジェクトを実行する一番簡単な方法はDockerを使うことです。
git clone https://github.com/evolution-foundation/evolution-go.git
cd evolution-go
make docker-build
make docker-run
アプリケーションを起動したら、設定ファイル.envを入力する必要があります。最小限の設定は以下の通りです:
SERVER_PORT=8080
CLIENT_NAME=my_app
GLOBAL_API_KEY=super-secret-key
POSTGRES_AUTH_DB=postgresql://postgres:pass@localhost:5432/evogo_auth?sslmode=disable
POSTGRES_USERS_DB=postgresql://postgres:pass@localhost:5432/evogo_users?sslmode=disable
DATABASE_SAVE_MESSAGES=false
ここで、最初の起動時に思わずつまづくことになる重要なポイントがあります。このプロジェクトはアクティブ化システムを採用しています。起動直後は、すべてのAPIエンドポイントが403エラーを返します。
サービスを動作させるには、アドレスhttp://localhost:8080/manager/loginにあるビルトインコントロールパネルを開き、GLOBAL_API_KEYを入力して短いインスタンス登録プロセスを経る必要があります。その後、ステータスがデータベースに保存され、APIが利用可能になります。
最初のメッセージ送信
アクティブ化が終わったら、アドレスhttp://localhost:8080/swagger/index.htmlのSwagger UIにアクセスするか、ターミナルからリクエストを送信します。
まず、インスタンスを作成し、WhatsAppリンク用のQRコードを入手します:
curl -X POST http://localhost:8080/instance/create \
-H "apikey: super-secret-key" \
-H "Content-Type: application/json" \
-d '{"instanceName": "office_number"}'
GET /instance/office_number/qrcodeでQRコードを入手し、スマホのWhatsAppアプリからスキャンして、テストテキストを送信します:
curl -X POST http://localhost:8080/message/sendText \
-H "apikey: super-secret-key" \
-H "Content-Type: application/json" \
-d '{
"instanceName": "office_number",
"number": "79991112233",
"text": "Привет! Это сообщение отправлено через Evolution Go."
}'
活用場面
まず第一に、独自のCRMシステム、サポートサービス、通知システムを構築している人々に役立つプロジェクトです。
同時に数十個のWhatsApp番号を接続したままにする必要があるなら、Go版はNode.js代替手段と比較してサーバーコストを大幅に節約できます。NATSとRabbitMQが標準装備なのも、既存のマイクロサービスアーキテクチャへの統合をずっと容易にします。
一方、短所としては最初の起動時にマネージャーでのアクティブ化ステップが必須である点です。Kubernetesへの完全自動デプロイを計画している場合、これは別ステップとしてスクリプト化する必要があります。
Evolution Goは、重厚な連携サービスに対する良い代替手段です。プロジェクトはまだ若いですが、Evolution Foundationエコシステム全体を並行して開発しているアクティブなコミュニティが背後にいます。
適切なREST APIを備えた高速なWhatsAppゲートウェイを求めていて、アクティブセッションごとに数GBのメモリを消費したくないなら、試す価値ありです。
関連プロジェクト