ルモーリン

hypnotoadでデータ更新と同期する方法

投稿:2021-03-02

ウチのサイトの更新情報(全記事の更新日順一覧など)は記事を追加、修正した際に再作成しています。 これは単一プロセスで稼働していましたから、サイトに秘密のAPIを通じて再作成をリクエスト、そのプロセス自身が持つ更新情報を再作成するだけで済みました。 ですけれどhypnotoadに移行したのでプリフォーク型のサーバーになり、(初期設定なので)ワーカープロセスが4個あります。 再作成をリクエストすると受け付けたワーカープロセスは更新情報を再作成しますが残りの3個はそのままです(笑)。

hypnotoadは(初期設定で)管理プロセス1個、ワーカープロセス4個で稼働しています。 ホットデプロイメントは新規プロセスがリクエストを受付するようになってから既存プロセスを停止するので端から見ると無停止で入れ替わります。

ワーカープロセスの起動時には初期処理として更新情報を作成しています。 頑張って稼働を継続したまま再作成するよりもWebサーバーを再起動させてしまえば良いことに気が付きました。 再作成のリクエストを受けたプロセスが管理プロセスにホットデプロイメントを要求して再起動します。 ワーカープロセスは4個あるので4個とも独立して作成します。

4個のワーカープロセスが更新情報を作成するのは何だか無駄に感じたので、更新情報を再利用する事にしました。 リクエストを受け付けたワーカープロセスだけが更新情報を作成、YAMLに保存します。 それから管理プロセスへホットデプロイメントを要求、再起動したワーカープロセスが初期処理でYAMLを読み更新情報を入手します。

リクエストを受けたワーカープロセスが他のワーカープロセスに連絡できれば再起動が不要になることに気が付きました(今頃?)。 既にRedisサーバーを稼働させているので、PubSubを使います。 ワーカープロセスは初期処理でSubscriptしておき、リクエストを受けたワーカープロセスが更新情報を再作成、Publishすると、Redisを経由して全てのワーカープロセスに通知が届いて更新情報をロードできる訳です。 自分で工夫して初めて分かる「なんで今までやらなかったんだろう」。 結局ホットデプロイメントが不要になりました。