69189


どちらかというとフロント寄りの人間で、最近バックエンドも触り始めて勉強で個人と友人でしか使用しないサービスを作ってるのですが質問があり投稿させて頂きました。

バックエンドでユーザーごとにAPIを使って情報を取得し続けるにはどのように通常考えて実装しますでしょうか。

作ってるサービスでは各ユーザーに紐づいた現在の口座残高と今の相場情報を取得し続けるなど、定期的にバックエンド側で、別のサービスが提供しているAPIを叩いてデータを取得し、フロント側でもTimeIntervalでバックエンド側に問い合わせて情報を取得したい、と思っております。

なので、サーバー側でその第三者のAPIを叩き値を取得する関数を書き、「サーバーサイドでTimeIndtervalを回す」という形になるのですが、

お恥ずかしい話最近知ったのですが、nodejsをバックエンドに使っていると、変数など同じ状態を各リクエストで使いまわすため、違うユーザーがリクエストしても同じオブジェクトを返すようです。

上記に気づいて、試しにテストで書いてみたのですが、例えば一人がログインし、その情報を変数に格納したとします。（こんなこと通常ではしないと思いますが、）その後ユーザー情報の問い合わせがあったとき、その変数を返す処理をしたとしたら、別のログインしてない人もGETで問い合わせた場合、その情報が返ってくる、ということですよね？  
そして試しにnodeでテストで書いたらそうなりました。

**質問1**  
例えば(レベルは違うけど)似た事を実現できているサービスとして、クラウド会計ソフトのfreeeやMoneyForwardなどでは、各ユーザーごとにフロントとは別にサーバー側でAPIが独自に走って残高や入出金履歴を取得している感じがしますが、こういった各ユーザーごとにサーバーサイドで処理を回したい場合どのように実現させる道があるのでしょうか。

**質問2**  
node以外のruby on
railsやlaravel、djangoなどのサーバーサイドフレームワークも基本はこのような「１つのサーバープロセスで変数、クラスなどの結果を保持しており、リクエストがあれば返す」仕様になってるのでしょうか。


CC BY-SA 4.0
2020-08-01T00:46:51.350
69151
2020-08-02T17:06:22.347
2020-08-02T13:06:53.037
3060
41331
question
node.js
nodeのバックエンドでユーザーごとにAPIを取得し続けるには


まず、WEBアプリケーションサーバー上にユーザー情報などをグローバルに持つやり方はアンチパターンです。ステートレスなアプリケーションにしましょう（[12
Factor App](https://12factor.net/ja/)を参照）。

その上で、今回やりたい処理はアプリケーションとは別に、バッチとして切り出し、タスクスケジューラー（cronなど）で実行すると良いでしょう。


CC BY-SA 4.0
2020-08-02T06:57:17.567
69179
2020-08-02T06:57:17.567
7997
69151
answer


http
のサーバーは、ステートレスに設計するのが普通です。ステートはデータベースに保持して、そこに対するマッパーとして実装します。ではどうやってリクエストを行っているユーザーを識別するかというと、フロントからのリクエストの中にユーザーの識別子を付与することで実現します。

rails などを普通に使った場合、この識別子はセッションIDとしてクッキーに埋め込まれ、 rails
側ではそのセッションIDをデータベースに問い合わせ、そこからユーザー情報を取得します。

freee などは、アプリのデータベースのデータ取得をおそらくバッチなどで別に実行しています。サーバー上でコマンドを cron
で定期実行するなど、やり方はいろいろあります。


CC BY-SA 4.0
2020-08-02T17:06:22.347
69189
2020-08-02T17:06:22.347
754
69151
answer