8

電子メールを送信するために、そのサブシステムに通知/公開するアプリケーションを設計する必要があります。jmsのパブリッシュ/サブスクライブ(トピック)メッセージを使用してこれを行うことを計画しました

今のところ可視性は、20から30のサブスクライバーがあり、公開されるメッセージの数は1日あたり30000から50000メッセージの範囲になります。

ActiveMQ JMS + Spring 3 +Tomcat6の実装 に関する質問を使用する予定です。

  1. 私はJMSにかなり慣れていませんが、上記の負荷が高いかどうか知りたいですか?

  2. サーバーにデプロイされた別個のActiveMQが本当に必要ですか、それともWebアプリケーションに埋め込まれたActiveMQを使用するだけで十分ですか?

  3. 個別のActiveMQサーバー/組み込みサーバーの長所/短所は何ですか?

4

2 に答える 2

7

最初に注意してください、あなたのメッセージの量は物事が進むにつれてかなり小さいです。あなたは実際にどちらかを使うことができ、維持するのが最も簡単なものはおそらくあなたの選択を決定するでしょう。

再起動に関するPetterのコメントを拡張すると、考慮すべき1つのことは、ブローカーに接続する他のマシンの数です。

クライアント

ブローカーに100台のマシンが接続されている場合、ActiveMQが組み込まれたTomcatを再起動するたびに、100台の接続が切断され、すべてを再接続する必要があります。ActiveMQは再接続をサポートしているため、正常に機能しますが、全員が再接続する間、メッセージフローに不必要な遅延が追加される可能性があり、場合によっては、いくつかのクライアントが再接続に失敗し、手動でそれらを実行に移す必要があります。

スタンドアロンのブローカーとたとえば100のクライアントを使用すると、Tomcatサーバーを何度でも再起動でき、ブローカーからTomcatへの接続を1つだけ切断できます。それはとてもいいことです。

クライアントが1つしかない場合(Tomcatサーバー自体)は、ハンドダウンが埋め込まれ、in-vmトランスポートを使用します。

メモリー

もう1つの要因はメモリです。AmazonEC2のActiveMQをt1.microで使用しています。t1.microのメモリは613MBで、かなり小さいです。2つのt1.micros(1つはActiveMQ用、もう1つはTomcat用)を実行する方が、両方を備えた1つのm1.smallよりも安価です。

しかし、繰り返しになりますが、クライアントの数が要因です。Tomcat以外にクライアントがない場合は、1つのm1.smallを実行し、すべてを同じvmに保持する方がおそらくはるかに優れています。

ご参考までに

TomcatとActiveMQが主要なターゲットである場合は、ActiveMQがすでに統合されているTomcatであるApacheTomEEPlusを検討する必要があります。

すべてのjarがあり、Petterが話しているローカルトランスポートを使用して、組み込みのActiveMQブローカーですべてがデフォルトでセットアップされます。スタンドアロンのActiveMQブローカーを使用するように簡単に構成できます。また、JavaMailが組み込まれているので、役に立つかもしれません。

そのため、セットアップの部分をスキップして、アプリの作成に直接取り掛かることができます。たとえば、この単一のサーブレットを作成し、それを他のjarやクラスとの戦争に置くと、次のように機能します。

@WebServlet("/hello-world")
public class MyServet extends HttpServlet {

    @Resource(name = "foo")
    private Topic fooTopic;

    @Resource(name = "bar")
    private Queue barQueue;

    @Resource
    private ConnectionFactory connectionFactory;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //...

        Connection connection = connectionFactory.createConnection();
        connection.start();

        // Create a Session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // Create a MessageProducer from the Session to the Topic or Queue
        MessageProducer producer = session.createProducer(fooTopic);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        // Create a message
        TextMessage message = session.createTextMessage("Hello World!");

        // Tell the producer to send the message
        producer.send(message);

        //...
    }

}

これは、Tomcatアダプターを介してEclipseでセットアップする方法を示す入門ビデオでもあります。

于 2012-06-23T19:35:15.840 に答える
4

負荷が高いかどうかはわかりません。それは実際にはメッセージのサイズと、永続的なメッセージとトランザクションを使用しているかどうかによって異なります。それらがほんの数10KBであるとすると、1台のサーバーで問題なく実行できるはずです。

埋め込みとスタンドアロンの問題は素晴らしい質問です。私が考えているいくつかの賛否両論を挙げさせてください。

スタンドアロン:Proスタンドアロン:

  • ActiveMQを使用するSpringアプリ以外のアプリケーションがある場合、アプリケーションを再起動するとActiveMQにも影響します。ただし、ここではそうではないようです。

  • 逆に、稼働時間が重要な場合は、SpringアプリケーションをオンにすることなくActiveMQインストールをアップグレードできます。

短所スタンドアロン:

  • 監視、操作などのために(別のインストール)についてもっと考える必要があります。

これがとにかく内部の1つのアプリケーションである場合、私は組み込みソリューションが好きです。ActiveMQは埋め込みに最適です。アプリケーションをスケールアウトする必要がある場合は、Springアプリを使用して別のサーバーを簡単に起動できます。ActiveMQインスタンスをXML行でクラスター化すると、そこに移動します。

組み込みソリューションのもう1つの利点は、SpringとActiveMQ間のトランスポートをJVM内部にすることができるため、メッセージはTCP / IPスタックを通過せず、メモリコピーになることです。それはあなたのアプリケーションをスピードアップします。

于 2012-06-22T14:35:44.573 に答える