問題タブ [system-design]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
system-design - インタビュー:システム・API設計
この質問は、ある大手ソフトウェア会社で行われました。私は簡単な解決策を思いついたので、その解決策について他の人がどう感じているか知りたい.
都市に住む人々に電話番号を割り当てることができるシステムの API とバックエンドを設計することになっています。電話番号は 111-111-1111 から始まり、999-999-9999 で終わります。API は、クライアント (都市の人々) が次のことを実行できるようにする必要があります。
- クライアントが電話番号を要求すると、使用可能な番号の 1 つが割り当てられます。
- 一部のクライアントは派手な番号が必要な場合があるため、割り当てられる番号を具体的に要求できます。要求された番号が利用可能な場合、システムはそれをそれらに割り当てます。それ以外の場合、システムは利用可能な番号を割り当てます。
システムは、どの番号がどのクライアントに割り当てられているかを知る必要はありません。同じクライアントが連続して要求を行い、複数の電話番号を取得する場合がありますが、システムは問題になりません。どの時点でも、システムはどの電話番号が割り当てられ、どの電話番号が空いているかだけを知っています。
111-111-1111 から 999-999-9999 までの数字は、およそ 80 億の数字に相当します。メモリが制約でないと仮定すると、次の 2 つのアプローチが考えられます (ほぼ同じです)。
長さ 80 億の巨大なブール配列を維持
next
し、配列インデックスを指すポインターを持ちます (next
ゼロに初期化されます)。が指す値が空きでない場合は、空き番号が見つかるまでnext
転送します。next
ファンシー番号が要求された場合は、対応するインデックス位置が空いているかどうかを確認して、番号を返します。このアプローチの欠点は、通常の方法で数値を割り当てる場合、派手な割り当てによって割り当てられた巨大なチャンク (たとえば 10 億) の数値が途中にある場合、next
ポインターを 10 億回移動する必要があることです。前の設計で述べた問題を克服するために、リンクされたハッシュマップのようなものを使用できます。二重にリンクされたリスト (これは前の設計の配列を置き換えます) と、配列の各要素がリスト内の対応する要素を指すリストと同じ長さの別の配列を維持します。そのため、通常の方法で数値を割り当てるときは、リンクされたリスト内のポインターを進め、割り当てるときにノードをマークします (前の方法と同じ)。ファンシーな番号を割り当てるとき、最初に配列にインデックスを付けてポインタをたどることで、要求された特別な番号に対応するリスト内のノードを直接見つけることができます。ノードが識別されると、
私が正しい軌道に乗っているかどうか教えてください。私が見逃している重要な詳細を教えてください。
web-applications - 内部および外部で使用するためのアプリケーションを構築する-それらをどのように構成しますか?
私は、当社のさまざまな情報システムを単一のWebベースのアプリケーションに統合することに取り組んでいます。小さな偉業ではありませんが、時間の経過とともに徐々に展開し、改善していきます。
このアプリケーションは、イントラネット用のスタッフ専用ポータルと、顧客がアクセスできるパブリックポータルの2つの領域に分かれています。
これを作成するのに問題はありませんが、それをホストする方法がわかりません。セキュリティは私が抱えている最大の懸念事項です。私たちのデータベースが機密情報をホストすることを考えると(そして、私がすべての重要なものとすべての通常のXSS / CSRF / SQLインジェクションを暗号化してハッシュすることを確信できます)
アプリケーションとデータベースの両方を同じサーバーで実行しますか?内部のものを安全に保つことができる場所で内部的に実行し、パブリックシステムにWeb APIを介して呼び出しを行わせるのですか?
この場合の保守性、セキュリティ、およびパフォーマンスの最適なバランスは何ですか?
python - 設計-タイムスタンプ(ストレージ)の処理方法と計算の実行方法; Python
私は(私のアプリケーションがさまざまなソースやさまざまなタイムゾーン、形式などからの大量のデータを処理しているため)データを保存して操作するのに最適な方法を決定しようとしています。
たとえば、すべてをUTCとして保存する必要がありますか?つまり、データをフェッチするときに、現在のタイムゾーンを特定する必要があります。UTCでない場合は、必要な変換を行ってデータを取得します。(注、私はESTにいます)。
次に、データに対して計算を実行するときに、抽出して(UTCと言う)、MYタイムゾーン(EST)に入る必要があるので、それを見るときに意味がありますか?UTCで保持し、すべての計算を行う必要がありますか?
このデータの多くは時系列であり、グラフ化され、グラフはESTになります。
これはPythonプロジェクトなので、次のようなデータ構造があるとします。
そして、現在の時刻(now())が>最後の+間隔(60秒が経過した)であるかどうかを判断することによって、これを操作する必要がありますか?したがって、コードでは:
それは理にかなっていますか?私はどこでもUTCを使用しており、保存と計算の両方で...
また、ソフトウェアでタイムスタンプを操作する方法についての優れた記事へのリンクがあれば、ぜひ読んでみてください。おそらく、アプリケーションでタイムスタンプを使用するためのJoel On Softwareのように?
security - 処理待ちの機密性の高い一時データのセキュリティ戦略
私は現在、ユーザーに代わってクライアントの自動化タスクを実行する REST API ベースのサービスのアルファ テスト/開発を行っています。Web アプリケーションは私のサーバーでホストされており、タスクはバックグラウンド サービス内で実行されているワーカーによって処理されます。負荷によっては、複数のサーバーで実行されているサービスのインスタンスが多数存在する場合があります。
ユーザーは API を介してセッションを作成し、セッションはデータベースに保存され、処理のためにキューに入れられます。次に、ユーザーはセッションのコマンドを発行します。ワーカー プロセスはセッションをデキューし、ユーザーがセッションを閉じるまでコマンドの処理を 1 つずつ開始します。コマンドの結果は、完了時にユーザーがアクセスできるようにデータベースに保存されます。
コマンド入力には、漏洩してはならない機密データが含まれている可能性があるため、処理されるまで安全に保つための適切な戦略は何でしょうか。処理後、入力は削除できますが、システムが処理するデータが漏洩する可能性はごくわずかであることをユーザーに保証したいと思います。
c++ - C++クラス関数は値を返しますVSはローカルデータを操作しますか?
クラス C があり、プロセスが次のようになっているとします。
- func1を行う
- func2を行う
- func3を行う
- func4をする
ここで、各関数は前のステージからのデータで動作します
システム設計の観点からどちらが優れていますか?
- 各関数が入力を受け取り、その結果を返し、結果を次のステージに渡すようにする
- 各 func がクラス c のデータ メンバーに対して動作するようにすると、それらはすべて void を返します
また、これら 2 つの戦略が有名なデザイン パターンである場合、それぞれのデザイン パターンの名前は何ですか?
java - 分散処理での最大スループット (netty 4.0 を使用)
分散処理用のシステムを構築し、ネットワーク I/O スタックに netty (4.0) を使用したいと考えています。
次の状況: プロデューサー タスク A とコンシューマー タスク B があります。タスク A は 64K のチャンクでデータを生成し、それをタスク B に送信します。タスク B は特定の状況で計算集約的になり、タスク A によって生成されたよりも遅く 64K ブロックを消費する可能性があります。 . タスク A と B は tcp チャネルで接続されています。
このアプローチについて考えてみます。タスク A がチャンクを生成し、それをローカル キューに入れます。tcp チャネルが空いていて、次の 64K をチャネルに書き込むことができる場合、キューからチャンクが自動的に取得されます (netty はそのようなシグナル/イベントを提供しますか?)。タスク A のキューが格納されたチャンクの固定制限を超えた場合、タスク B がチャンクを消費するまでタスク A をブロックします。本質的には、タスク A の「受信者がトリガーする書き込み」で、TCP チャネルを輻輳させることなく完全に利用できるようにする必要があります。この設計の目標は、データ スループットを最大にすることです。
現在、いくつかの質問があります:)
それは最大のスループットを実現するための適切な設計ですか? TCP チャネルを十分に活用するためのより良い設計は何でしょうか?
netty はこれらのシナリオに適したフレームワークですか? (私は netty にはかなり慣れていませんが、フレームワークの明確な抽象化/設計が本当に好きです!)
そんなデザインがnettyで実現できるのか?=> (受信側サイトからそのような信号/イベントが得られますか?)
最大スループットを可能にする netty を使用した最適な設計はどれですか?
より適切な他のフレームワークはありますか?
どんなアイデアやメモでも大歓迎です!!!
よろしくお願いします!!! トビ