activemq的使用場景

一、消息隊列概述
消息隊列中間件是分布式系統中重要的組件,主要解決應用耦合,異步消息,流量削鋒等問題。實現高性能,高可用,可伸縮和最終一致性架構。是大型分布式系統不可缺少的中間件。

目前在生產環境,使用較多的消息隊列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。

二、消息隊列應用場景
以下介紹消息隊列在實際應用中常用的使用場景。異步處理,應用解耦,流量削鋒和消息通訊四個場景。本篇使用ActiveMQ+SpringBoot來模擬這四個場景。

2.1異步處理
場景說明:汽車觸發圍欄報警后,需要發送報警郵件和報警短信。傳統的做法有兩種1.串行的方式;2.并行方式。

(1)串行方式:將報警信息寫入數據庫成功后,發送報警郵件,再發送報警短信。以上三個任務全部完成后,該報警信息加入統計列表。
在這里插入圖片描述
(2)并行方式:報警信息寫入數據庫成功后,同時發送報警郵件和短信。
在這里插入圖片描述
假設三個業務節點每個使用50毫秒鐘,不考慮網絡等其他開銷,則串行方式的時間是150毫秒,并行的時間可能是100毫秒。

因為CPU在單位時間內處理的請求數是一定的,假設CPU1秒內吞吐量是100次。則串行方式1秒內CPU可處理的請求量是7次(1000/150)。并行方式處理的請求量是10次(1000/100)。

小結:如以上案例描述,傳統的方式系統的性能(并發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?

引入消息隊列,將不是必須的業務邏輯,異步處理。改造后的架構如下:
在這里插入圖片描述
代碼示例

①在pom文件中引入activemq依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId><version>1.5.6.RELEASE</version></dependency>

②在配置文件中加上activemq的配置

spring.activemq.broker-url=tcp://127.0.0.1:61616
# 在考慮結束之前等待的時間
#spring.activemq.close-timeout=15s 
# 默認代理URL是否應該在內存中。如果指定了顯式代理,則忽略此值。
spring.activemq.in-memory=true 
# 是否在回滾回滾消息之前停止消息傳遞。這意味著當啟用此命令時,消息順序不會被保留。
spring.activemq.non-blocking-redelivery=false
# 密碼
spring.activemq.password=123456
# 等待消息發送響應的時間。設置為0等待永遠。
spring.activemq.send-timeout=0
spring.activemq.user=haha
# 是否信任所有包
#spring.activemq.packages.trust-all=
# 要信任的特定包的逗號分隔列表(當不信任所有包時)
#spring.activemq.packages.trusted=
# 當連接請求和池滿時是否阻塞。設置false會拋“JMSException異常”。
#spring.activemq.pool.block-if-full=true
# 如果池仍然滿,則在拋出異常前阻塞時間。
#spring.activemq.pool.block-if-full-timeout=-1ms
# 是否在啟動時創建連接。可以在啟動時用于加熱池。
#spring.activemq.pool.create-connection-on-startup=true
# 是否用Pooledconnectionfactory代替普通的ConnectionFactory。
#spring.activemq.pool.enabled=false 
# 連接過期超時。
#spring.activemq.pool.expiry-timeout=0ms
# 連接空閑超時
#spring.activemq.pool.idle-timeout=30s
# 連接池最大連接數
#spring.activemq.pool.max-connections=1
# 每個連接的有效會話的最大數目。
#spring.activemq.pool.maximum-active-session-per-connection=500
# 當有"JMSException"時嘗試重新連接
#spring.activemq.pool.reconnect-on-exception=true
# 在空閑連接清除線程之間運行的時間。當為負數時,沒有空閑連接驅逐線程運行。
#spring.activemq.pool.time-between-expiration-check=-1ms
# 是否只使用一個MessageProducer
#spring.activemq.pool.use-anonymous-producers=true

③消息生產者

import java.util.Map;import javax.jms.Destination;
import javax.jms.Queue;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessagePostProcessor;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 報警消息Producer* @author ko**/
@Component
//@EnableScheduling
public class AlarmProducer {// 也可以注入JmsTemplate,JmsMessagingTemplate對JmsTemplate進行了封裝@Autowiredprivate JmsTemplate jmsTemplate;
//    private JmsMessagingTemplate jmsTemplate;//    @Autowired
//    private Queue queue;//    @Scheduled(fixedDelay=5000) // 5s執行一次   只有無參的方法才能用該注解public void sendMessage(Destination destination, String message){
//        jmsTemplate.convertAndSend(destinationName, payload, messagePostProcessor);this.jmsTemplate.convertAndSend(destination, message);}// 雙向隊列// @JmsListener(destination="out.queue") //   public void consumerMessage(String text){  //   System.out.println("從out.queue隊列收到的回復報文為:"+text);  // }
}

⑤controller里寫上測試接口

@Autowiredprivate AlarmProducer alarmProducer;@RequestMapping(value="/chufabaojing",method=RequestMethod.GET)@ApiOperation(value="觸發報警", notes="觸發報警")@ApiImplicitParams({@ApiImplicitParam(name = "devicename", value = "name",example = "xxxx", required = true, dataType = "string",paramType="query"),})public String chufabaojing(String devicename){List<String> alarmStrList = new ArrayList<>();alarmStrList.add(devicename+"out fence01");alarmStrList.add(devicename+"out fence02");alarmStrList.add(devicename+"in fence01");alarmStrList.add(devicename+"in fence02");System.out.println("設備"+devicename+"出圍欄報警");// 報警信息寫入數據庫System.out.println("報警數據寫入數據庫。。。");// 寫入消息隊列Destination destination = new ActiveMQQueue("mytest.queue");for (String alarmStr : alarmStrList) {alarmProducer.sendMessage(destination, alarmStr);}// 消息寫進消息隊列里就不管了// 下面兩步驟移到activemq消費者里// 發送郵件// 發送短信return "success";}

2.2 應用解耦
場景介紹,在spring cloud分布式微服務項目中,工單管理和設備管理分別是兩個微服務,如果A工單被張三接單了,那么工單狀態要設為已派單,檢驗員設為張三,設備狀態要置為在檢。

傳統的做法是,先調用工單管理的工單更新接口,成功之后再調用設備管理的設備更新接口,成功之后再返回操作提示給用戶。這樣做的缺點是應用耦合,如果在派單操作的時候正好設備管理微服務掛了或者阻塞了,那么派單操作就會失敗或者要等待很長時間無反饋。另外如果設備管理的接口有變動,那么工單管理里面的代碼也要改動。
在這里插入圖片描述
引入消息中間件,派單的時候,工單管理的工單更新接口處理好后把信息寫入消息隊列,然后直接返回操作反饋給用戶。不管工單管理服務正不正常,正常就從消息隊列里訂閱消息處理,不正常就等待回復正常后再訂閱消息處理。
在這里插入圖片描述
2.3 流量削峰
場景介紹,XX公司的系統原來是針對A地區的客戶開發的,現在為了搶占市場,拿下了B和C兩個地區的客戶,那么新系統上線,就存在如何把B和C的基礎數據導入XX公司的系統中來的問題,短時間內要把龐大的舊數據改造適合新系統再導入進來,這很容易使系統掛掉,另外每天還有增量數據產生。

這時可以引入消息中間件,B和C的客戶只要負責把數據規則放到消息隊列里就好了,XX公司可以有條不紊的從消息隊列里訂閱數據,可以有效緩解短時間內的高流量壓力,但是這也對消息中間件的可靠性提出了要求。

如果遇到activemq的瓶頸,可以看看activemq集群方案,這篇文章 http://blog.csdn.net/shuangzh115/article/details/50989182

2.4 點對點通訊
類似聊天室的功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249732.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249732.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249732.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

復習JavaScript隨手記

數據類型 基本類型 stringnumberbooleanundefinednumber類型,包含整數浮點數 NaN和自己都不相等,涉及NaN的計算結果都是NaN isNaN()函數用于判斷一個數是不是NaN 引用類型 object類型 function類型 繼承自object object類型定義了prototype屬性 可以通過它動態給對象綁定方法和…

TP5在前端時間戳轉換為時間格式

value"{:date(Y-m-d H:i:s,$data[add_date])}" 例如&#xff1a; <td>{:date(Y-m-d H:i:s,$d[create_time])}</td> 轉載于:https://www.cnblogs.com/shark1100913/p/9468077.html

Java(發布/訂閱模式)

1、概述 觀察者模式又稱為發布/訂閱(Publish/Subscribe)模式 觀察者設計模式涉及到兩種角色&#xff1a;主題&#xff08;Subject&#xff09;和觀察者&#xff08;Observer&#xff09; &#xff08;1&#xff09;Subject模塊 Subjec模塊有3個主要操作 addObserver()&#…

VUE $SET源碼

轉載于:https://www.cnblogs.com/smzd/p/11634255.html

JS 日期格式化

1、將中國標準時間格式化為&#xff08;2017-06-06 15:05:04&#xff09; function formatDateTime(theDate) { var _hour theDate.getHours(); var _minute theDate.getMinutes(); var _second theDate.getSeconds(); var _year theDate.getFullYear() var _month theDat…

canvas 入門

<canvas>是HTML5新增的&#xff0c;是可以使用腳本&#xff08;JavaScript&#xff09;在其中繪制圖像的HTML元素。 canvas是由HTML代碼配合高度和寬度屬性而定義出的可繪制區域&#xff0c;JavaScript代碼可訪問該區域&#xff0c;類似于其它通用的二維API&#xff0c;通…

Java實現消息隊列服務

使用 JAVA 語言自己動手來寫一個MQ (類似ActiveMQ,RabbitMQ) 主要角色 首先我們必須需要搞明白 MQ (消息隊列) 中的三個基本角色 ProducerBrokerConsumer 整體架構如下所示 自定義協議 首先從上一篇中介紹了協議的相關信息,具體廠商的 MQ(消息隊列) 需要遵循某種協議或者…

Knockout中ko.utils中處理數組的方法集合

每一套框架基本上都會有一個工具類&#xff0c;如&#xff1a;Vue中的Vue.util、Knockout中的ko.utils、jQuery直接將一些工具類放到了$里面&#xff0c;如果你還需要更多的工具類可以試試lodash。本文只介紹一下Knockout中ko.utils中處理數組的一些方法。 ko.utils.arrayForEa…

$nextTick 源碼

x現在沒時間&#xff0c;留個坑 轉載于:https://www.cnblogs.com/smzd/p/11634665.html

java 發布訂閱

1.發布者接口 package com.yy.subpub; /** * Description: 發布者接口 * author: leijing * date: 2016年9月29日 下午5:07:20 */ public interface IPublisher<M> { /** * Description: 向訂閱器發布消息 * param subscribePublish 訂閱器 * param message 消息 * para…

.NET Core Session的簡單使用

前言 在之前的.NET 里&#xff0c;我們可以很容易的使用Session讀取值。那今天我們來看看 如何在.NET Core中讀取Session值呢&#xff1f; Session 使用Session之前&#xff0c;我們需要到Startup.cs中配置我們的服務如下&#xff1a; ①在ConfigureServices中加入&#xff1a;…

EasyNVR內網攝像機接入網關+EasyNVS云端管理平臺,組件起一套輕量級類似于企業級螢石云的解決方案...

背景分析 對于EasyNVR我們應該都了解&#xff0c;主要應用于互聯安防直播&#xff0c;對于EasyNVR&#xff0c;我們可以清楚的發現&#xff0c;EasyNVR的工作機制是EasyNVR拉取攝像機的RTSP/Onvif視頻流&#xff0c;然后客戶端可以通過訪問EasyNVR服務端實現流分發&#xff0c;…

java.util.Queue用法

隊列是一種特殊的線性表&#xff0c;它只允許在表的前端&#xff08;front&#xff09;進行刪除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;進行插入操作。進行插入操作的端稱為隊尾&#xff0c;進行刪除操作的端稱為隊頭。隊列中沒有元素時&#xff0c;稱為空隊…

Vim刪除文件到行首或者行尾

vim用的不是很熟練&#xff0c;只是有時候需要的時候會學習一下 我們知道&#xff0c;vim有三種模式&#xff0c;一種是一般模式&#xff0c;一種是編輯模式&#xff0c;另外一種是命令行模式 在一般模式下&#xff0c;可以進行刪除&#xff0c;復制粘貼等操作&#xff0c;在編…

新版本微信導致的ios表單bug

解決方法如下&#xff1a; $(document).delegate(input, textarea, select, blur, function(){setTimeout(function(){$(html).animate({height: 100.1vh}, 100, function(){$(this).animate({height: 100vh}, 1)})},100); }); 轉載于:https://www.cnblogs.com/qdlhj/p/1033676…

Golang的值類型和引用類型的范圍、存儲區域、區別

常見的值類型和引用類型分別有哪些&#xff1f; 值類型&#xff1a;基本數據類型 int 系列, float 系列, bool, string 、數組和結構體struct&#xff0c;使用這些類型的變量直接指向存在內存中的值&#xff0c;值類型的變量的值通常存儲在棧中。 引用類型&#xff1a;指針、sl…

python3之time模塊

時間戳1: import time2: print(time.time()) 可讀的時間格式1: import time2: print(time.ctime())3: later time.time() 6004: print(time.ctime(later)) 結果1: Wed Jan 30 17:11:49 20192: Wed Jan 30 17:21:49 2019 暫停程序(進程或者線程)1: time.sleep(secs) 計時時鐘1…

網絡規劃設計(項目類業務)

前期準備&#xff1a;找經開部要到當地的現場結構圖 1.和通信段約好時間&#xff0c;實地跑一趟&#xff0c;找到光纜、電纜的原匯聚點。 2.與車間人員溝通&#xff0c;看是否要遷匯聚點&#xff0c;倘若遷匯聚點&#xff0c;遷到哪里。 3.怎么從光纜/電纜的舊址遷到新址&#…

RPC框架實現原理

一、什么是RPC框架&#xff1f; RPC&#xff0c;全稱為Remote Procedure Call&#xff0c;即遠程過程調用&#xff0c;是一種計算機通信協議。 比如現在有兩臺機器&#xff1a;A機器和B機器&#xff0c;并且分別部署了應用A和應用B。假設此時位于A機器上的A應用想要調用位于B機…

jQuery安裝

http://www.runoob.com/jquery/jquery-install.html 網頁中添加jQuery&#xff1a; 方法一&#xff1a;可以從http://jquery.com/download/ 下載jQuery庫 方法二&#xff1a;從CDN中載入jQuery 下載 jQuery 有兩個版本的 jQuery 可供下載&#xff1a; Production version - 用于…