簡體   English   中英

通過websocket的RabbitMQ Stomp:無法檢索排隊的消息

[英]RabbitMQ Stomp over websocket : Unable to retrieve queued messages

我正在使用RabbitMQ Stomp的持久訂閱( 此處的文檔)。 根據文檔,當客戶端使用相同的ID重新連接(訂閱)時,他應該獲得所有排隊的消息。 但是,即使消息在服務器端排隊,我也無法收回任何東西。 下面是我正在使用的代碼:

RabbitMQ版本:3.6.0

客戶代碼:

var sock;
var stomp;
var messageCount = 0;
var stompConnect = function() {

sock = new SockJS(options.url);

stomp = Stomp.over(sock);
stomp.connect({}, function(frame) {
debug('Connected: ', frame);
console.log(frame);

var id = stomp.subscribe('<url>' + options.source + "." + options.type + "." + options.id, function(d) {
    console.log(messageCount);
    messageCount = messageCount + 1;
}, {'auto-delete' : false, 'persistent' : true , 'id' : 'unique_id', 'ack' : 'client'});
}, function(err) {
console.log(err);
debug('error', err, err.stack);
setTimeout(stompConnect, 10);
});
};

服務器代碼:

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(final MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("<endpoint>", "<endpoint>").setRelayHost(host)
        .setSystemLogin(username).setSystemPasscode(password).setClientLogin(username)
                .setClientPasscode(password);
    }

    @Override
    public void registerStompEndpoints(final StompEndpointRegistry registry) {
        registry.addEndpoint("<endpoint>").setAllowedOrigins("*").withSockJS();
    }
}

我正在執行的步驟:

  • 在客戶端運行腳本,它發送訂閱請求。
  • 在服務器端創建一個隊列(名稱為stomp-subscription- *),所有消息均被推送到隊列中,客戶端能夠流式傳輸這些消息。
  • 殺死腳本,這導致斷開連接。 服務器日志顯示客戶端已斷開連接,消息開始排隊。
  • 使用相同的ID再次運行腳本。 它以某種方式設法連接到服務器,但是,服務器未返回任何消息。 該隊列上的消息數保持不變(而且,RabbitMQ管理控制台也未顯示該隊列的任何使用者)。
  • 10秒后,連接被斷開,以下日志記錄在客戶端日志中:

哎呦! 與<URL>的連接斷開

  • 服務器還顯示相同的消息(即客戶端已斷開連接)。 如客戶端代碼所示,它嘗試在10秒后建立連接,然后再次重復相同的循環。

我嘗試了以下操作:

  1. 刪除了'ack' : 'client'頭。 這導致所有消息都從隊列中耗盡,但是沒有消息到達客戶端。 經過這個 SO答案后,我添加了此標頭。
  2. 添加了d.ack(); 在函數中,在遞增messageCount之前。 這會導致服務器端出錯,因為它在會話關閉后(由於斷開連接)試圖確認消息。

另外,在某些情況下,當我重新排隊的郵件數少於100時,我就能獲得所有郵件。 但是,一旦超過100,就什么也沒發生(不確定是否與問題有關)。

我不知道問題是否存在於服務器端或客戶端。 有輸入嗎?

最后,我能夠找到(並解決)該問題。 我們使用nginx作為代理,並且將proxy_buffering設置為on (默認值),請參閱此處的文檔。

它是這樣說的:

啟用緩沖后,nginx會盡快從代理服務器收到響應,並將其保存到proxy_buffer_size和proxy_buffers指令設置的緩沖區中。

因此,郵件被緩沖(延遲),導致斷開連接。 我們嘗試繞過nginx並正常工作,然后禁用代理緩沖,即使使用nginx代理,它現在似乎也可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM