質問: どちらかというとフロント寄りの人間で、最近バックエンドも触り始めて勉強で個人と友人でしか使用しないサービスを作ってるのですが質問があり投稿させて頂きました。 バックエンドでユーザーごとにAPIを使って情報を取得し続けるにはどのように通常考えて実装しますでしょうか。 作ってるサービスでは各ユーザーに紐づいた現在の口座残高と今の相場情報を取得し続けるなど、定期的にバックエンド側で、別のサービスが提供しているAPIを叩いてデータを取得し、フロント側でもTimeIntervalでバックエンド側に問い合わせて情報を取得したい、と思っております。 なので、サーバー側でその第三者のAPIを叩き値を取得する関数を書き、「サーバーサイドでTimeIndtervalを回す」という形になるのですが、 お恥ずかしい話最近知ったのですが、nodejsをバックエンドに使っていると、変数など同じ状態を各リクエストで使いまわすため、違うユーザーがリクエストしても同じオブジェクトを返すようです。 上記に気づいて、試しにテストで書いてみたのですが、例えば一人がログインし、その情報を変数に格納したとします。(こんなこと通常ではしないと思いますが、)その後ユーザー情報の問い合わせがあったとき、その変数を返す処理をしたとしたら、別のログインしてない人もGETで問い合わせた場合、その情報が返ってくる、ということですよね? そして試しにnodeでテストで書いたらそうなりました。 **質問1** 例えば(レベルは違うけど)似た事を実現できているサービスとして、クラウド会計ソフトのfreeeやMoneyForwardなどでは、各ユーザーごとにフロントとは別にサーバー側でAPIが独自に走って残高や入出金履歴を取得している感じがしますが、こういった各ユーザーごとにサーバーサイドで処理を回したい場合どのように実現させる道があるのでしょうか。 **質問2** node以外のruby on railsやlaravel、djangoなどのサーバーサイドフレームワークも基本はこのような「1つのサーバープロセスで変数、クラスなどの結果を保持しており、リクエストがあれば返す」仕様になってるのでしょうか。
回答: http のサーバーは、ステートレスに設計するのが普通です。ステートはデータベースに保持して、そこに対するマッパーとして実装します。ではどうやってリクエストを行っているユーザーを識別するかというと、フロントからのリクエストの中にユーザーの識別子を付与することで実現します。 rails などを普通に使った場合、この識別子はセッションIDとしてクッキーに埋め込まれ、 rails 側ではそのセッションIDをデータベースに問い合わせ、そこからユーザー情報を取得します。 freee などは、アプリのデータベースのデータ取得をおそらくバッチなどで別に実行しています。サーバー上でコマンドを cron で定期実行するなど、やり方はいろいろあります。