1. 程式人生 > >基於Redis實現分散式訊息佇列(1)

基於Redis實現分散式訊息佇列(1)

1、為什麼需要訊息佇列?

當系統中出現“生產“和“消費“的速度或穩定性等因素不一致的時候,就需要訊息佇列,作為抽象層,彌合雙方的差異。

舉個例子:業務系統觸發簡訊傳送申請,但簡訊傳送模組速度跟不上,需要將來不及處理的訊息暫存一下,緩衝壓力。
再舉個例子:調遠端系統下訂單成本較高,且因為網路等因素,不穩定,攢一批一起傳送。
再舉個栗子,互動模組5:00到24:00和電商系統聯通,和內部ERP斷開。1:00到4:00和ERP聯通,和電商系統斷開。
再舉個例子,服務員點菜快,廚師做菜慢。
再舉個例子,到銀行辦事的人多,提供服務的視窗少。
乖乖排隊吧。

2、使用訊息佇列有什麼好處?

2.1、提高系統響應速度

使用了訊息佇列,生產者一方,把訊息往佇列裡一扔,就可以立馬返回,響應使用者了。無需等待處理結果。

處理結果可以讓使用者稍後自己來取,如醫院取化驗單。也可以讓生產者訂閱(如:留下手機號碼或讓生產者實現listener介面、加入監聽佇列),有結果了通知。獲得約定將結果放在某處,無需通知。

2.2、提高系統穩定性

考慮電商系統下訂單,傳送資料給生產系統的情況。
電商系統和生產系統之間的網路有可能掉線,生產系統可能會因維護等原因暫停服務。

如果不使用訊息佇列,電商系統資料釋出出去,顧客無法下單,影響業務開展。
兩個系統間不應該如此緊密耦合。應該通過訊息佇列解耦。同時讓系統更健壯、穩定。

3、為什麼需要分散式?

3.1、多系統協作需要分散式

訊息佇列中的資料需要在多個系統間共享資料才能發揮價值。
所以必須提供分散式通訊機制、協同機制。

3.2、單系統內部署環境需要分散式

單系統內部,為了更好的效能、為了避免單點故障,多為叢集環境。
叢集環境中,應用執行在多臺伺服器的多個JVM中;資料也儲存在各種型別的資料庫或非資料庫的多個節點上。
為了滿足多節點協作需要,需要提供分散式的解決方案。

4、分散式環境下需要解決哪些問題

4.1、併發問題

需進行良好的併發控制。確保“執行緒安全“。

不要出現一個訂單被出貨兩次。不要出現顧客A下的單,發貨發給了顧客B等情況。

4.2、簡單的、統一的操作機制

需定義簡單的,語義明確的,業務無關的,恰當穩妥的統一的訪問方式。

4.3、容錯

控制好單點故障,確保資料安全。

4.4、可橫向擴充套件

可便捷擴容。

5、如何實現?

成熟的訊息佇列中介軟體產品太多了,族繁不及備載。

成熟產品經過驗證,介面規範,可擴充套件性強。

結合事業環境因素、組織過程遺產、實施運維考慮、技術路線考慮、開發人員情況等原因綜合考慮,基於Redis自己做一個是最可行的選擇。

如何做呢?
請聽下回分解。

相關推薦

基於Redis實現分散式訊息佇列1

1、為什麼需要訊息佇列? 當系統中出現“生產“和“消費“的速度或穩定性等因素不一致的時候,就需要訊息佇列,作為抽象層,彌合雙方的差異。 舉個例子:業務系統觸發簡訊傳送申請,但簡訊傳送模組速度跟不上,需要將來不及處理的訊息暫存一下,緩衝壓力。 再舉個例子:調

基於Redis實現分散式訊息佇列4

1、訪問Redis的工具類 public class RedisManager { private static Pool<Jedis> pool; protected final static Logger logger

基於Redis實現分散式訊息佇列3

1、Redis是什麼鬼? Redis是一個簡單的,高效的,分散式的,基於記憶體的快取工具。 假設好伺服器後,通過網路連線(類似資料庫),提供Key-Value式快取服務。 簡單,是Redis突出的特色。 簡單可以保證核心功能的穩定和優異。 2、效能

基於Redis實現分散式訊息佇列彙總目錄

基於Redis實現分散式訊息佇列(1)– 緣起 基於Redis實現分散式訊息佇列(2)– 分散式訊息佇列功能設計 基於Redis實現分散式訊息佇列(3)– Redis功能分析 基於Redis實現分散式訊息佇列(4)– 程式碼實現

靈感來襲,基於Redis分散式延遲佇列

背景 上一篇(靈感來襲,基於Redis的分散式延遲佇列)講述了基於Java DelayQueue和Redis實現了分散式延遲佇列,這種方案實現比較簡單,應用於延遲小,訊息量不大的場景是沒問題的,畢竟Java DelayQueue是佔用記憶體的。針對現用方案的不足,於是利用Redis的Sorted S

基於雙端堆實現的優先順序佇列1:原理

前言    眾所周知,stl中的優先順序佇列是基於最大堆實現的,能夠在對數時間內插入元素和獲取優先順序最高的元素,但如果要求在對數時間內還能獲取優先順序最低的元素,而不只是獲取優先順序最高的元素,該怎麼實現呢?可以用最大堆-最小堆或雙端堆資料結構來實現,最大堆-最小堆和雙端堆都是支援雙端優先佇列

大型網站架構系列:分散式訊息佇列

以下是訊息佇列以下的大綱,本文主要介紹訊息佇列概述,訊息佇列應用場景和訊息中介軟體示例(電商,日誌系統)。 本次分享大綱 訊息佇列概述 訊息佇列應用場景 訊息中介軟體示例 JMS訊息服務(見第二篇:大型網站架構系列:分散式訊息佇列(二)) 常用訊息佇列(見第二篇:大型網站架構系列:分

Spring Scheduled + Redis 實現分散式定時器

1、需要了解的技術點: 1.1、Redis的命令:SETNX,EXPIRE; 1.2、Spring的Scheduled定時器註解,觸發器,任務,排程器; 1.3、Spring的applicati

大型網站架構系列:分散式訊息佇列

以下是訊息佇列以下的大綱,本文主要介紹訊息佇列概述,訊息佇列應用場景和訊息中介軟體示例(電商,日誌系統)。 本次分享大綱 一、訊息佇列概述 訊息佇列中介軟體是分散式系統中重要的元件,主要解決應用耦合,非同步訊息,流量削鋒等問題。實現高效能,高可用,可伸縮和最終一致性架構。是大型分散式系統不可缺少的中介軟體。

基於zookeeper實現分散式配置中心

  上一篇(基於zookeeper實現分散式配置中心(一))講述了zookeeper相關概念和工作原理。接下來根據zookeeper的特性,簡單實現一個分散式配置中心。 配置中心的優勢 1、各環境配置集中管理。 2、配置更改,實時推送,jvm環境變數及時生效。 3、依靠配置變更,動態擴充套件功能,

利用Redis實現非同步訊息佇列優化系統性能 Redis高階應用

寫在前面 今天把之前在專案中使用 Redis 做非同步訊息佇列的使用經驗總結一下。首先明確使用目的,因為專案中,我們進行某個操作後可能後續會有一系列的其他耗時操作,但是我們不希望將主執行緒阻塞在此過程中,這時便可將其他操作非同步化。舉個栗子,當你給這篇部落格點贊或評論的時候

Delayer 基於 Redis 的延遲訊息佇列中介軟體

Delayer 基於 Redis 的延遲訊息佇列中介軟體,採用 Golang 開發,支援 PHP、Golang 等多種語言客戶端。 參考 有贊延遲佇列設計 中的部分設計,優化後實現。 專案連結:https://github.com/mixstart/d... ,有需要的朋友加 Star 哦。 應用場景

基於Redis實現分散式

背景 在很多網際網路產品應用中,有些場景需要加鎖處理,比如:秒殺,全域性遞增ID,樓層生成等等。大部分的解決方案是基於DB實現的,Redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶端對Redis的連線並不存在競爭關係。其次Redis提供一些命令SETNX,GETSET,可以方便

基於Docker搭建分散式訊息佇列Kafka

本文基於Docker搭建一套單節點的Kafka訊息佇列,Kafka依賴Zookeeper為其管理叢集資訊,雖然本例不涉及叢集,但是該有的元件都還是會有,典型的kafka分散式架構如下圖所示。本例搭建的示例包含Zookeeper + Kafka + Kafka-manger mark &

Netty實戰開發(7):Netty結合kafka實現分散式訊息佇列

在分散式遊戲伺服器系統中,訊息處理佇列主要解決問題就是解耦系統中的業務,使得每個系統看起來功能比較單一,而且解決一些全服資料共享等問題。 通常我們知道kafka是作為訊息佇列比較火的一種方式,其實還有(Active MQ,Rabbit MQ,Zero MQ)個人

LCN基於Spring cloud2.0實現分散式事物管理LCN的修改和部署

首先,對專案進行編譯,裝好maven環境,jdk環境。命令如下,注意這裡需要jdk1.8以上 mvn install -Dmaven.test.skip=true 打包之後,將編譯好的jar包上傳到自己的私服。 獲取最新的tx-manager的jar

Spring boot基於redis實現附近的人附原始碼下載

核心原始碼 public class NearbyPO { @NotNull(message = "id值不能為空") private Integer id; @NotBlank(message

基於 Redis 實現分散式

什麼是Redis? Redis通常被稱為資料結構伺服器。這意味著Redis通過一組命令提供對可變資料結構的訪問,這些命令使用帶有TCP套接字和簡單協議的伺服器 - 客戶端模型傳送。因此,不同的程序可以以共享方式查詢和修改相同的資料結構。 Redis中實現的資料結構有一些特殊屬性:

基於Python語言使用RabbitMQ訊息佇列

釋出/訂閱 前面的教程中我們已經建立了一個工作佇列。在一個工作佇列背後的假設是每個任務恰好會傳遞給一個工人。在這一部分裡我們會做一些完全不同的東西——我們會發送訊息給多個消費者。這就是所謂的“釋出/訂閱”模式。 為了解釋這種模式,我們將會構建一個簡單的日誌系

基於雙端堆實現的優先順序佇列3:外觀

   本文講述雙端堆的5個公開泛型操作演算法:make_dheap(原位構造雙端堆)、push_dheap(插入元素)、pop_max_dheap(刪除最大元素)、pop_min_dheap(刪除最小元素),is_dheap(堆驗證),每個演算法都提供<小於運算子和仿函式比較2個版本,要注意