ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A


4
マイクロサービスの多対多の関連付け
現在、2つのマイクロサービスがあります。私たちはそれらAを呼び出しますB。 マイクロサービス下のデータベースにAは次の表があります。 A |-- users マイクロサービス下のデータベースにBは次の表があります。 B |-- trackers 要件にはそれが明記されusersてtrackersおり、多対多の関係があります。 マイクロサービスアーキテクチャ内でこれを適切に処理する方法がわかりません。 これは、次の3つの方法のいずれかで動作することがわかりました。 user_trackersテーブルには、microserviceに追加されますA。これは、「外部キー」への参加を含むテーブルに似た働きusersとtrackers。 ownersテーブルには、microserviceに追加されますB。このテーブルは、ポリモーフィック結合テーブルと同様に機能します。これにより、どのサービスでもトラッカーとの関連付けを作成できます。これは次のようになります。 B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id レコードキープusersし、trackers各microserviceでは。ある種のpubsubシステムと同期してください。 もともとオプション2を使用するつもりだったのは、トランザクションの境界が保存されていることが気に入ったからです。トラッカーを作成して、それをアトミックに関連付けることができます。ただし、microserviceの範囲外のようBです。BマイクロサービスAが関連付けを作成することをマイクロサービスが気にする必要があるのはなぜですか? ここにはおそらく気付いていない良いパターンがあるように感じます。私がレイアウトしたオプションのいずれかが意味をなしますか?より意味のある別のオプションはありますか?

2
従来のメッセージブローカーとストリーミングデータ
カフカのサイトによると: 「Kakfaは、リアルタイムデータパイプラインとストリーミングアプリの構築に使用されます。」 インターネットを広く検索して、「ストリームデータ」とは何かについて、一般に受け入れられている次の定義を見つけました。 ストリームデータは、ネットワークを介してソースから宛先に連続して流れるデータです。そして ストリームデータは本質的にアトミックではありません。つまり、データのフローストリームのどの部分も意味があり、処理可能であることを意味します。そして ストリームデータはいつでも開始/停止できます。そして 消費者は自由にデータのストリームをアタッチおよびデタッチし、必要な部分だけを処理できます さて、上で言ったことが間違っている、不完全である、または完全に間違っている場合、私を修正することから始めてください!多かれ少なかれ軌道に乗っていると仮定すると... 「ストリーミングデータ」が何であるかを理解したので、KafkaとKinesisがストリーミングデータを使用するアプリケーションの処理/仲介ミドルウェアとして自身に請求するときの意味を理解しました。しかし、それは私の興味をそそりました。KafkaやKinesisのような「ストリームミドルウェア」を、従来のメッセージブローカーのような非ストリーミングデータに使用できるかどうか。そしてその逆:RabbitMQ、ActiveMQ、Apolloなどの従来のMQをデータのストリーミングに使用できますか、または使用すべきですか? アプリケーションが処理が必要なJSONメッセージのバックエンドの一定の集中砲火を送信する例を見てみましょう。処理はかなり複雑です(検証、データの変換、フィルタリング、集計など)。 ケース#1:メッセージは映画の各フレームです。これは、フレームデータといくつかのサポートメタデータを含むビデオフレームごとに1つのJSONメッセージです ケース#2:メッセージは時系列データであり、おそらく時間の関数としての誰かのハートビートです。したがって、t = 1でのハートビートを表すメッセージ#1が送信され、t = 2でのメッセージ#2にはハートビートが含まれます。 ケース#3:データは完全にばらばらであり、時間によって、または「データストリーム」の一部として無関係です。おそらく、数百人のユーザーがボタンをクリックしてアクションを実行するアプリケーションをナビゲートすると発生する監査/セキュリティイベント Kafka / Kinesisの課金方法と「ストリーミングデータ」とは何であるかを理解すると、これらはケース#1(連続したビデオデータ)と#2(連続した時系列データ)の明らかな候補のようです。ただし、RabbitMQのような従来のメッセージブローカーがこれらの入力の両方を効率的に処理できなかった理由はわかりません。 また、ケース#3では、発生したイベントのみが提供されるため、そのイベントに対する反応を処理する必要があります。私にとってこれは、RabbitMQのような従来のブローカーが必要であることを意味します。しかし、KafkaまたはKinesisでイベントデータの処理を処理できない理由もありません。 だから基本的に、私は言うルーブリックを確立しようとしています:私はY特性を持つXデータを持っています。Kafka / Kinesisのようなストリームプロセッサを使用して処理する必要があります。または、逆に、私が判断するのに役立つもの:Z特性を持つWデータがあります。従来のメッセージブローカーを使用して処理する必要があります。 だから私は尋ねる:データ(またはそれ以外)がストリームプロセッサとメッセージブローカーの間の決定を導くのに役立つのは、どちらもストリーミングデータを処理でき、両方が(非ストリーミング)メッセージデータを処理できるからですか?

3
バックエンドIDは公開するか、REST APIで公開しないか?
この男が言うことに基づいて:http : //toddfredrich.com/ids-in-rest-api.html UUIDを使用してAPIリソースを識別することについて彼が正しいと仮定します。次に、そのように実装しようとすると問題が発生します。これは次のとおりです。 class FooEntity { final String id = null; //auto-generated by my backend (mongodb), not shared final UUID uid = UUID.randomUUID(); //the resource id } (クライアントとサーバー間では、データベースエンティティではなく、送受信されるDTOです。) 問題は、id私がもう使用していないので役に立たないということです。クライアントがリクエストを行うuidので、なぜ2つのIDを処理する必要があるのですか?次に、最初の同じ問題に戻ります。UUIDを主キー(_id)として設定すると、バックエンドIDが公開されます。 そのほかに、効率性のトピックがあります。ObjectIdによるインデックス作成はUUIDよりもはるかに効率的であると読みました。

2
マルチテナントのマイクロサービス設計
現在、モノリシックアプリケーションをマイクロサービスアーキテクチャに移行しています。いくつかの規制要件により、異なる国のクライアントのデータを個別の(国固有の)データベースに保管する必要があります。すなわち、米国の顧客のための米国db、英国の顧客のための英国db ... 私たちが検討している次の設計は次のとおりです。 オプション1:必要に応じてN回までスケーリングできる、休止状態のマルチテナントサポートを備えたマルチテナントアプリケーション(kubernetesポッドを考えてください)。このアプリケーションの単一インスタンスは、すべてのデータベースに接続できます。 オプション2:国のデータベースごとに1つのマイクロサービスインスタンスを展開します。APIゲートウェイの前にトラフィックをルーティングする このタイプのシステムを設計する場合、どのような選択肢がありますか?

8
C文字列は常にヌルで終了しますか、それともプラットフォームに依存しますか?
現在、私は組み込みシステムで作業しており、オペレーティングシステムなしでマイクロプロセッサに文字列を実装する方法を考えています。これまでのところ、私がやっていることは、NULLで終了する文字ポインタを持つという考えを使用し、NULLが終了を示す文字列として扱うことです。私はこれがかなり一般的であることを知っていますが、これが当てはまることを常に期待できますか? 私が尋ねる理由は、ある時点でリアルタイムオペレーティングシステムを使用することを考えていたため、現在のコードを可能な限り再利用したいからです。そこにあるさまざまな選択肢について、文字列が同じように機能することをほとんど期待できますか? 私の場合はもっと具体的にしましょう。私は、シリアルポート経由でコマンドを受け取って処理するシステムを実装しています。コマンド処理コードを同じにして、RTOS(コマンドを含む)で作成された文字列オブジェクトがすべてNULLで終了することを期待できますか?または、OSに基づいて異なりますか? 更新 この質問を見るようにアドバイスされた後、私はそれが私が尋ねていることを正確に答えていないことを決定しました。質問自体は、文字列の長さを常に渡す必要があるかどうかを尋ねています。これは私が尋ねているものとはまったく異なり、答えの一部には有用な情報が含まれていましたが、私が探しているものではありません。なぜか理由を与えるためにそこに見えた答えではないヌル文字で文字列を終了させます。私が尋ねているものとの違いは、異なるプラットフォームの生まれた文字列がnullで独自の文字列を終了することを多かれ少なかれ期待できるかどうか、それが理にかなっている場合は、すべてのプラットフォームを試してみる必要はありません。

6
次のコードスニペットからあまりにも多くのif / else-ifから脱出するより良い方法は何ですか?
入力として渡された「アクション」値に基づいてタスクを実行するサーブレットを作成しようとしています。 サンプルは次のとおりです public class SampleClass extends HttpServlet { public static void action1() throws Exception{ //Do some actions } public static void action2() throws Exception{ //Do some actions } //And goes on till action9 public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { String action = req.getParameter("action"); /** * I find …

2
Pythonで値を返す関数に名前を付けるにはどうすればよいですか?
Pythonで関数の名前を選択することについて混乱しています。時々 、Pythonは組み込み関数ですが不可欠のような:print機能と文字列の方法find。時々、それらは次のようなものではありません:lenその名前はcalculate_len、たとえばなどの命令型でtypeはなく、find_typeです。 これprintは、使用しない値(つまりNone)を返し、何かをする(つまり、画面に文字列を表示する)ため、その名前は必須です。 ただしlen、使用する値を返し、何かを実行します(つまり、シーケンスまたはマッピングに存在するアイテムの数を計算します)。その名前は必須ではありません。一方、find文字列メソッド(as len)は、使用する値を返し、何かを実行します。その名前は必須です。 この質問をしたのは、Caesar暗号を使用して文字列を暗号化および復号化するスクリプトをレビューに追加したことです。レビューアは次のように言った: ただの直感:関数は何かをします。したがって、関数の適切な名前は必須rotate_letterですrotated_letter。代わりにを使用します。 rotated_letter数字で回転した文字を表す1文字の文字列を返します。私はrotated_letterそれが値を返すのでrandint、ランダムモジュールの関数のように使用しましたが、そうではありませんgenerate_randint。 したがって、この場合、使用する値を返す関数にどのように名前を付ける必要がありますか?名前を必須にするべきか、それとも名詞にするべきか。他の場合では、次のような、それを行う方法は明らかですブール関数のような、is_evenそしてis_palindrome我々は同じようにそれを作るはい/いいえ質問し、また機能だけで行うと戻り未使用の値(つまり、Noneなど)、printおよびlistメソッドsort。

3
DDD:ドメインイベントハンドラーの配置場所
ドメインイベントハンドラーをDDDに配置するのに適したレイヤーはどれかという意見を教えてください。たとえば、新しい契約を追加するアプリケーションサービスがあり、契約が追加されたときに連絡先に電子メール通知を送信したいので、その電子メール送信者(ContractAddedイベントを処理する)アプリケーションサービスまたはドメインサービスまたは他に何か?

3
なぜ「自己」が必要なのですか。インスタンス変数を参照するPythonで?
Java、Ruby、Haskell、Pythonなどの多くの言語でプログラミングを行ってきました。作業しているプロジェクトが異なるため、1日に多くの言語を切り替える必要があります。今、問題はself、Pythonの関数定義の最初のパラメーターが同じオブジェクトのメソッドを呼び出すことと同じであるため、書くのを忘れることが多いことです。 そうは言っても、このPythonのアプローチには非常に驚かされます。基本的には、JavaやRubyなどの言語では、現在のオブジェクトの変数を自動的に参照することで簡単にできるように、もっと入力する必要があります。 私の質問は、なぜこれがself必要なのですか?それは純粋にスタイルの選択ですか、それともPythonでselfJavaとC ++で省略できる方法を省略できないのthisですか?

2
トップレベル関数のUMLクラス図記号
UMLクラス図表記法では、カプセル化クラスやその他の構造を持たない最上位関数をどのように示すのですか? たとえば、URLからデータを取得するために使用する関数があります。パラメータと共有グローバル状態のみの関数であるため(数学的な意味で)、関数はクラスに入れられず、トップレベルのメソッドとして残されます。 しかし今では、それを使用してプログラムのUMLダイアグラムを作成する必要があり、トップレベル関数を示す方法については何も見つかりません。どうすればいいですか?
13 uml 

3
継承よりも合成
私は自分自身にソフトウェア工学を教えようとしていますが、私を混乱させる矛盾する情報に出くわします。 私はOOPと抽象クラス/インターフェースとは何か、そしてそれらをどのように使用するかを学びましたが、「継承よりも合成を優先する」べきだと読んでいます。構成とは、あるクラスが別のクラスのオブジェクトを構成/作成して、その新しいオブジェクトの機能を利用/対話することです。 だから私の質問は...抽象クラスとインターフェイスを使用しないはずですか?抽象クラスを作成せず、その抽象クラスの機能を具象クラスで拡張/継承し、代わりに、新しいオブジェクトを作成して他のクラスの機能を使用するだけですか? または、構成を使用し、抽象クラスから継承することになっています。両方を一緒に使用しますか?もしそうなら、それがどのように機能し、その利点のいくつかの例を提供できますか? 私はPHPに最も慣れているので、他の言語に移り、新しく習得したSEスキルを移転する前に、それを使用してOOP / SEスキルを向上させています。

2
プログラミング言語が割り当てに=を使用し始めたのはなぜですか?
ほとんどの初期のアルゴリズムの本では、<-割り当てと=比較に言及していました。しかし、最近では、=割り当てに使用しない言語はPascal(:=)とCOOLのようなおもちゃの言語だけです。現代のプログラミング言語=が、数学的な平等の意味ではなく、意味の割り当てに変わった原因は何ですか?

1
C#辞書の効率
C#辞書は、何かが存在するかどうかなどを見つける簡単な方法です。どのように機能するかについては質問があります。辞書の代わりにArrayListを使用するとしましょう。ContainsKey(または別の言語の同等のメソッド)を使用する代わりに、ArrayListをループして、そこに何かが存在するかどうかを確認します(または、データが並べ替えられているか、類似のものであればバイナリ検索を実行します)。効率の違いは何ですか?ContainsKeyメソッドは、キーをループして検索しているものが存在するかどうかをチェックするのではなく、より効率的な方法を使用していますか? 私が持っているデータの種類に対応する特定のハッシュ関数を作成し、そのデータのセット用に特別に設計されている場合、そのハッシュ関数はデータをループするよりも実際に高速です。しかし、辞書は一般的です。ContainsKeyメソッドは、取得するデータに固有ではなく、一般的な検索メソッドです。 基本的に私が求めているのは。辞書はプログラマーに役立ちます。それらには、多くのことを支援するメソッドが含まれており、文字列を整数(キーと値)などと組み合わせています。しかし、効率については、彼らは何を提供していますか?持つに違い何dictionary対ArrayListのをstructs(string,int)

3
依存性注入:どの時点で新しいオブジェクトを作成できますか?
私はPHPアプリケーションをリファクタリングしていますが、可能な限り多くの依存性注入(DI)をしようとしています。 私はそれがどのように機能するかをよく理解しているように感じますし、クラスがかなりスリムで堅牢になっているのを確かに見ることができます。 クラス内に新しいオブジェクトを作成するのではなく依存関係を注入できるようにリファクタリングしていますが、ある時点でいくつかのオブジェクトを作成する必要があります。つまり、dreaded newキーワードを使用します。 私が今直面している問題は、どの時点で実際に新しいオブジェクトを作成できるかということです。私は最終的にトップレベルのクラスになり、他に行く場所がないため、新しいオブジェクトを大量に作成するように見えます。これは間違っているように感じます。 ファクトリクラスを使用してすべてのオブジェクトを作成するブログを読んだ後、ファクトリを他のクラスに注入します。その後、ファクトリメソッドを呼び出すと、ファクトリが新しいオブジェクトを作成します。 これを行うことに対する私の懸念は、今では私のファクトリークラスがnewすべて自由になることです!ファクトリクラスであるため、これで問題ないかもしれませんが、ファクトリパターンとDIを使用する場合に固執するいくつかのルールはありますか、それともここから外れますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.