我有一個Java應用程序,其中有許多通過JMS(ActiveMQ)進行通信的組件。目前應用程序和JMS Hub位於同一臺服務器上,儘管我們最終計劃拆分組件的可伸縮性。目前,我們在性能方面存在重大問題,尤其是在JMS方面,最顯着的是,這個問題的焦點在於向主題發佈消息所花費的時間。JMS(ActiveMQ)性能
我們有大約50個動態創建的主題用於應用程序組件之間的通信。一個組件從表中讀取記錄並逐個處理它們,處理過程涉及創建JMS對象消息並將其發佈到其中一個主題。這個處理跟不上記錄寫入源表的速度〜23/sec,所以我們改變了處理過程來創建JMS對象消息並將它添加到隊列中。創建一個新線程,從該隊列中讀取並將消息發佈到適當的主題。顯然,這並不能加快處理速度,但它確實讓我們看到了排隊的大小後面到底有多遠。
在一天的開始時間裏,沒有任何信息通過整個系統,在第一個小時內從1560000(433 /秒)信息通過集線器快速增加到第三個小時的2100000(582/sec)然後停留在那個水平。在第一個小時開始時,從數據庫表中讀取組件的消息發佈的消息保持不變,但在那一小時結束時,在等待發送的隊列中有2000條消息,並且在第3個小時的時間隊列中有9000條消息在裏面。
下面是發送JMS消息的代碼的相關章節,關於我們做錯了什麼的建議或者我們如何改進這種性能非常感謝。查看Web上的統計信息JMS應該能夠輕鬆處理〜1000-2000條大消息/秒或〜10000條小消息/秒。我們的消息每個都是500字節左右,所以我想可以坐在這個規模的中間。
代碼用於獲取出版商:
private JmsSessionPublisher getJmsSessionPublisher(String topicName) throws JMSException {
if (!this.topicPublishers.containsKey(topicName)) {
TopicSession pubSession = (ActiveMQTopicSession) topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
ActiveMQTopic topic = getTopic(topicName, pubSession);
// Create a JMS publisher and subscriber
TopicPublisher publisher = pubSession.createPublisher(topic);
this.topicPublishers.put(topicName, new JmsSessionPublisher(pubSession, publisher));
}
return this.topicPublishers.get(topicName);
}
發送消息:
JmsSessionPublisher jmsSessionPublisher = getJmsSessionPublisher(topicName);
ObjectMessage objMessage = jmsSessionPublisher.getSession().createObjectMessage(messageObj);
objMessage.setJMSCorrelationID(correlationID);
objMessage.setJMSTimestamp(System.currentTimeMillis());
jmsSessionPublisher.getPublisher().publish(objMessage, false, 4, 0);
代碼這增加了消息到隊列:
List<EventQueue> events = eventQueueDao.getNonProcessedEvents();
for (EventQueue eventRow : events) {
IEvent event = eventRow.getEvent();
AbstractEventFactory.EventType eventType = AbstractEventFactory.EventType.valueOf(event.getEventType());
String topic = event.getTopicName() + topicSuffix;
EventMsgPayload eventMsg = AbstractEventFactory.getFactory(eventType).getEventMsgPayload(event);
synchronized (queue) {
queue.add(new QueueElement(eventRow.getEventId(), topic, eventMsg));
queue.notify();
}
}
代碼在螺紋去除的物品隊列:
jmsSessionFactory.publishMessageToTopic(e.getTopic(), e.getEventMsg(), Integer.toString(e.getEventMsg().hashCode()));
publishMessageToTopic執行上面的'發送消息'代碼。
如果您認爲ActiveMQ可能不是最佳選擇,那麼其他JMS實現是一種選擇。
謝謝
詹姆斯
您使用的是交易?你有什麼配置的隊列?他們真的排隊嗎?還是話題?這麼多的問題 :)。什麼版本的ActiveMQ?獨立?在應用程序服務器上? – 2010-11-01 17:57:01
除非默認使用,否則我們不明確使用交易。我們不在hub上創建任何配置,而是使用以下命令動態創建主題:topic =(ActiveMQTopic)this.initialContext.lookup(「dynamicTopics /」+ topicName);我們使用運行在獨立實例中的ActiveMQ版本5.3.2。 – James 2010-11-02 07:48:57
那麼這個問題有什麼問題?你解決了嗎? – 2012-10-28 18:42:36