# 全面解剖 消息中間件 RocketMQ-(4)

全面解剖 消息中間件 RocketMQ-(4)

一、RocketMQ 順序消息分析

1、消息有序:指的是可以按照消息的發送順序來消費(FIFO)。RocketMQ 可以嚴格的保證消息有序,可以分為分區有序或者全局有序。

2、順序消費的原理解析

在默認的情況下消息發送會采取 Round Robin 輪詢方式把消息發送到不同的 queue (分區隊列),而消費消息的時候從多個 queue上拉取消息,這種情況發送和消費是不能保證順序。但是如果控制發送的順序消息只依次發送到同一個 queue 中,消費的時候只從這個 queue 上依次拉取,則就保證了順序。當發送和消費參與的 queue 只有一個,則是全局有序;如果多個 queue 參與,則為分區有序,即相對每個 queue,消息都是有序的。

3、下面用訂單進行分區有序的示例。一個訂單的順序流程是:創建、付款、推送、完成。訂單號相同的消息會被先后發送到同一個隊列中,消費時,同一個 Orderld 獲取到的肯定是同一個隊列。

在這里插入圖片描述

二、RocketMQ 順序消息發送者

1、在工程 rocketmq_demo (模塊)中,創建 訂單構建 實體類 OrderStep.java


/***  D:\java-test\idea2019\rocketmq_demo\src\main\java\djh\it\mq\rocketmq\order\OrderStep.java**  2024-6-2 創建 訂單構建 實體類 OrderStep.java*/package djh.it.mq.rocketmq.order;import java.util.ArrayList;
import java.util.List;public class OrderStep {private long orderId;  //訂單 idprivate String desc;   //訂單描述public long getOrderId() {return orderId;}public void setOrderId(long orderId) {this.orderId = orderId;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}@Overridepublic String toString() {return "OrderStep{" +"orderId=" + orderId +", desc='" + desc + '\'' +'}';}public static List<OrderStep> buildOrders() {// 1039L    : 創建 付款 推送 完成// 1065L    : 創建 付款// 7235L    : 創建 付款List<OrderStep> orderList = new ArrayList<OrderStep>();OrderStep orderDemo = new OrderStep();orderDemo.setOrderId(1039L);orderDemo.setDesc("創建");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(1065L);orderDemo.setDesc("創建");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(1039L);orderDemo.setDesc("付款");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(7235L);orderDemo.setDesc("創建");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(1065L);orderDemo.setDesc("付款");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(7235L);orderDemo.setDesc("付款");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(1065L);orderDemo.setDesc("完成");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(1039L);orderDemo.setDesc("推送");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(7235L);orderDemo.setDesc("完成");orderList.add(orderDemo);orderDemo = new OrderStep();orderDemo.setOrderId(1039L);orderDemo.setDesc("完成");orderList.add(orderDemo);return orderList;}
}

2、在工程 rocketmq_demo (模塊)中,創建 順序消息發送 類 Producer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\order\Producer.java**   2024-6-2  創建 順序消息發送 類 Producer.java*/
package djh.it.mq.rocketmq.order;import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;import java.util.List;public class Producer {public static void main(String[] args) throws Exception {//1.創建消息生產者 producer,并制定生產者組名DefaultMQProducer producer = new DefaultMQProducer("group1");//2.指定 Nameserver 地址(集群配置)//producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)producer.setNamesrvAddr("172.18.30.110:9876");//3.啟動 producerproducer.start();//構建消息集合List<OrderStep> orderSteps = OrderStep.buildOrders();//發送消息for(int i=0; i<orderSteps.size(); i++){String body = orderSteps.get(i)+"";//4.創建消息對象,指定主題 Topic、Tag 和消息體//參數一:消息對象, 參數二:消息隊列選擇器, 參數三:選擇隊列的業務標識(訂單id)Message message = new Message("OrderTopic", "Order", "i"+i, body.getBytes());//5.發送 異步 消息SendResult sendResult = producer.send(message, new MessageQueueSelector(){/**** @param mqs :隊列集合* @param msg :消息對象				 ** @param arg :業務標識的參數* @return*/public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {long orderId = (Long) arg;long index = orderId % mqs.size();return mqs.get((int) index);}}, orderSteps.get(i).getOrderId());System.out.println("發送結果:"+sendResult);}//6.關閉生產者 producer。producer.shutdown();  	   }
}

三、RocketMQ 順序消息消費者

1、在工程 rocketmq_demo (模塊)中,創建 順序消息消費 類 Consumer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\order\Consumer.java**   2024-6-2  創建 順序消息消費 類 Consumer.java 。*/
package djh.it.mq.rocketmq.order;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;import java.util.List;public class Consumer {public static void main(String[] args) throws Exception {//1.創建消費者 Consumer,制定消費者組名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");//2.指定 Nameserver 地址(集群配置)//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)consumer.setNamesrvAddr("172.18.30.110:9876");//3.訂閱主題 Topic 和 Tagconsumer.subscribe("OrderTopic", "*");  //接收所有消息。//4.注冊消息監聽器consumer.registerMessageListener(new MessageListenerOrderly() {public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {for(MessageExt msg : msgs){System.out.println("線程名稱:【"+Thread.currentThread().getName() + "】 消費消息:" + new String(msg.getBody()));  //轉換為字符串消息}return ConsumeOrderlyStatus.SUCCESS;}});//5.啟動消費者 consumer。consumer.start();System.out.println("消費消息啟動了");}
}

2、先啟動 順序消息發送 類 Producer.java,再啟動 順序消息消費 類 Consumer.java 進行測試。

在這里插入圖片描述

四、RocketMQ 延遲消息

1、RocketMQ 延遲消息

比如電商里,提交了一個訂單就可以發送一個延時消息,1h 后去檢查這個訂單的狀態,
如果還是未付款就取消訂單釋放庫存。

2、RocketMQ 延遲消息 使用限制

//org/apache/rocketmg/store/config/Messagestoreconfig.java

private string messageDelayLevel = “1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”.

現在 RocketMg 并不支持任意時間的延時,需要設置幾個固定的延時等級,從 1s 到 2h 分別對應著等級 1 到 18。

3、在工程 rocketmq_demo (模塊)中,創建 延遲消息 發送 類 Producer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\delay\Producer.java**   2024-6-2  創建 延遲消息 發送 類 Producer.java*/
package djh.it.mq.rocketmq.delay;import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import java.util.concurrent.TimeUnit;public class Producer {public static void main(String[] args) throws Exception {//1.創建消息生產者 producer,并制定生產者組名DefaultMQProducer producer = new DefaultMQProducer("group1");//2.指定 Nameserver 地址(集群配置)//producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)producer.setNamesrvAddr("172.18.30.110:9876");//3.啟動 producerproducer.start();//發送消息for(int i=0; i<10; i++){//4.創建消息對象,指定主題 Topic、Tag 和消息體//參數一:消息主題 Topic, 參數二:消息 Tag, 參數三:消息內容Message msg = new Message("DelayTopic", "Tag1", ("Hello World"+i).getBytes());//設定延遲發送 時間為 5 秒(目前 rocketmq 支持的延遲等級:"1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h".)msg.setDelayTimeLevel(2);//5.發送消息SendResult result = producer.send(msg);System.out.println("發送結果:"+result);TimeUnit.SECONDS.sleep(1);  //線程睡1秒}//6.關閉生產者 producer。producer.shutdown();}
}

4、在工程 rocketmq_demo (模塊)中,創建 延遲消息 消費 類 Consumer.java 。


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\delay\Consumer.java**   2024-6-2  創建 延遲消息 消費 類 Consumer.java 。*/
package djh.it.mq.rocketmq.delay;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;import java.util.List;public class Consumer {public static void main(String[] args) throws Exception {//1.創建消費者 Consumer,制定消費者組名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");//2.指定 Nameserver 地址(集群配置)//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)consumer.setNamesrvAddr("172.18.30.110:9876");//3.訂閱主題 Topic 和 Tag//consumer.subscribe("base", "Tag1");  //接收同步消息//consumer.subscribe("base", "Tag2");  //接收異步消息前,可以讓先發送異步消息。//consumer.subscribe("base", "Tag1 | Tag2");  //接收同步消息 和 異步消息consumer.subscribe("DelayTopic", "*");  //接收所有消息。//添加消費模式//consumer.setMessageModel(MessageModel.CLUSTERING);  //默認是負載均衡模式消費consumer.setMessageModel(MessageModel.BROADCASTING);  //廣播模式消費//4.設置回調函數,處理消息consumer.registerMessageListener(new MessageListenerConcurrently(){//接受消息內容public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){//System.out.println(msgs); //接收到的消息是未轉換的字節碼for(MessageExt msg : msgs){System.out.println("消息ID:【" + msg.getMsgId()+"】,延遲時間:"+(System.currentTimeMillis()-msg.getStoreTimestamp()));  //轉換為字符串消息}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});//5.啟動消費者 consumer。consumer.start();System.out.println("消費者啟動");}
}

5、先啟動 延遲消息 消費 類 Consumer.java 再啟動 延遲消息 發送 類 Producer.java 進行測試。

在這里插入圖片描述

五、RocketMQ 批量消息發送

1、批量發送消息能顯著提高傳遞小消息的性能。限制是這些批量消息應該有相同的 topic,相同的 waitstoreMsgOK,而且不能是延時消息。此外,這一批消息的總大小不應超過無 4MB。如果消息的總長度可能大于4MB時,這時候最好把消息進行分割。

2、在工程 rocketmq_demo (模塊)中,創建 批量消息發送 發送 類 Producer.java


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\batch\Producer.java**   2024-6-2  創建 批量消息發送的 發送 類 Producer.java*/
package djh.it.mq.rocketmq.batch;import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;public class Producer {public static void main(String[] args) throws Exception {//1.創建消息生產者 producer,并制定生產者組名DefaultMQProducer producer = new DefaultMQProducer("group1");//2.指定 Nameserver 地址(集群配置)//producer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)producer.setNamesrvAddr("172.18.30.110:9876");//3.啟動 producerproducer.start();//創建一個集合List<Message> msgs = new ArrayList<Message>();//發送消息//4.創建消息對象,指定主題 Topic、Tag 和消息體//參數一:消息主題 Topic, 參數二:消息 Tag, 參數三:消息內容Message msg1 = new Message("BatchTopic", "Tag1", ("Hello World"+1).getBytes());Message msg2 = new Message("BatchTopic", "Tag1", ("Hello World"+2).getBytes());Message msg3 = new Message("BatchTopic", "Tag1", ("Hello World"+3).getBytes());msgs.add(msg1);msgs.add(msg2);msgs.add(msg3);//5.發送消息SendResult result = producer.send(msgs);System.out.println("發送結果:"+result);TimeUnit.SECONDS.sleep(1);  //線程睡1秒//6.關閉生產者 producer。producer.shutdown();}
}

3、在工程 rocketmq_demo (模塊)中,創建 批量消息發送 消費 類 Consumer.java 。


/***   rocketmq_demo\src\main\java\djh\it\mq\rocketmq\batch\Consumer.java**   2024-6-2  創建 批量消息發送 消費 類 Consumer.java 。*/
package djh.it.mq.rocketmq.batch;import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;import java.util.List;public class Consumer {public static void main(String[] args) throws Exception {//1.創建消費者 Consumer,制定消費者組名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");//2.指定 Nameserver 地址(集群配置)//consumer.setNamesrvAddr("192.168.25.135:9876;192.168.25.138:9876");//2.指定 Nameserver 地址(非集群配置)consumer.setNamesrvAddr("172.18.30.110:9876");//3.訂閱主題 Topic 和 Tagconsumer.subscribe("BatchTopic", "*");  //接收所有消息。//4.設置回調函數,處理消息consumer.registerMessageListener(new MessageListenerConcurrently(){//接受消息內容public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context){//System.out.println(msgs); //接收到的消息是未轉換的字節碼for(MessageExt msg : msgs){System.out.println("consumeThread=" + Thread.currentThread().getName()+", "+new String(msg.getBody()));  //轉換為字符串消息}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});//5.啟動消費者 consumer。consumer.start();System.out.println("消費者啟動");}
}

4、先啟動 批量消息發送 消費 類 Consumer.java 再啟動 批量消息發送 發送 類 Producer.java 進行測試。

在這里插入圖片描述

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

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

相關文章

身份證真假查詢API、C#身份證識別、駕駛證識別接口

線上平臺想要在節省成本、節省時間的前提下實現身份證實名認證的功能&#xff0c;可以考慮云服務平臺&#xff0c;例如翔云API開放平臺&#xff0c;專注于數字化接口服務的提供。翔云身份證實名認證接口&#xff0c;搭配翔云身份證識別接口&#xff0c;實時聯網秒速核驗身份證信…

vfrom二開給左邊添加字段或者容器

例如&#xff0c;我在左側加入一個 我的公司 字段 修改三個文件&#xff0c;這是文件目錄 這個文件是當界面選擇 簡體中文 的時候&#xff0c;顯示的 字段組件 或者 容器組件的中文名 這個文件是當界面選擇 English 的時候&#xff0c;顯示的 字段組件 或者 容器組件的英文名 把…

Spring Boot 集成 zxing 生成條形碼與二維碼

前面我們知道了怎么通過 使用 zxing 生成二維碼以及條形碼&#xff0c; 由于我們現在都是 web 端的項目了&#xff0c;那么我們看下怎么使用 Spring Boot 集成然后返回給前端展示&#xff1a; 工程源碼 對應的工程源碼我放到了這里&#xff1a;github源碼路徑&#xff0c;點擊…

d2-crud-plus 使用小技巧(六)—— 表單下拉選擇 行樣式 溢出時顯示異常優化

問題 vue2 elementUI d2-crud-plus&#xff0c;數據類型為select時&#xff0c;行樣式顯示為tag樣式&#xff0c;但是如果選擇內容過長就會出現下面這種bug&#xff0c;顯然用戶體驗不夠友好。 期望 代碼 js export const crudOptions (vm) > {return {...columns:…

圖書管理系統(https://github.com/plusmultiply0/bookmanagesystem)

特意去github找了一個用flask框架的項目&#xff0c;一起來學習它吧 這個系統包括很多功能&#xff1a;用戶權限管理模塊&#xff08;管理員和普通用戶&#xff09;&#xff0c;注冊登錄模塊&#xff08;滑塊驗證碼功能&#xff09;&#xff0c;圖書有關信息模塊&#xff08;借…

毫米級精度3D人臉掃描設備,助推打造元宇宙虛擬分身

在元宇宙中&#xff0c;虛擬分身對應的是一個三維模型&#xff0c;數字化的過程則是三維重建過程&#xff0c;通過3D人臉掃描可以通過多相機同步采集人臉部&#xff0c;可快速、準確地重建出真人地臉部模型及貼圖&#xff0c;通過3D人臉掃描設備可快速重建出高逼真的虛擬分身。…

Linux系統下+jmeter分布式壓測

一.配置jdk&#xff08;Linux機都需配置同一個版本&#xff09; 下載Linux系統的jdk&#xff0c;下載地址&#xff1a;https://repo.huaweicloud.com/java/jdk/ 下載后的jdk文件上傳到 /opt目錄下 進入opt目錄&#xff0c;查看jdk文件 cd /opt ll 1.解壓文件 tar xzvf jd…

真國色碼上贊,科技流量雙劍合璧,商家獲客新紀元開啟

在數字化浪潮洶涌的今天,真國色研發團隊依托紅玉房網絡科技公司的雄厚實力,憑借科技領先的核心競爭力,推出了創新性的商家曝光引流工具——碼上贊。這款工具借助微信支付與視頻號已有功能,為實體商家提供了一種全新的引流獲客方式,實現了科技與商業的完美融合。 科技領先,流量黑…

CSS 空間轉換 動畫

目錄 1. 空間轉換1.1 視距 - perspective1.2 空間轉換 - 旋轉1.3 立體呈現 - transform-style1.4 空間轉換 - 縮放 2. 動畫 - animation2.1 動畫的基本用法2.1 animation 復合屬性2.2 animation 拆分屬性2.3 多組動畫 正文開始 1. 空間轉換 空間&#xff1a;是從坐標軸角度定義…

Paddle實現單目標檢測

單目標檢測 單目標檢測&#xff08;Single Object Detection&#xff09;是人工智能領域中的一個重要研究方向&#xff0c;旨在通過計算機視覺技術&#xff0c;識別和定位圖像中的特定目標物體。單目標檢測可以應用于各種場景&#xff0c;如智能監控、自動駕駛、醫療影像分析等…

短視頻矩陣系統搭建開發,ai智能剪輯系統,矩陣發布,一鍵管理多個賬戶

前言&#xff1a; 企業短視頻矩陣是企業通過搭建多個短視頻平臺賬號&#xff0c;形成一個多元化的內容傳播網絡。它旨在通過多平臺內容的同步傳播&#xff0c;實現企業品牌價值的最大化。短視頻矩陣包括抖音、快手、視頻號、小紅書、百家號等熱門短視頻平臺&#xff0c;其核心…

LeetCode 每日一題 數學篇 2520.統計能整除數字的位數

給你一個整數 num &#xff0c;返回 num 中能整除 num 的數位的數目。 如果滿足 nums % val 0 &#xff0c;則認為整數 val 可以整除 nums 。 int countDigits(int num) {int t num, res 0;while (t) {if (num % (t % 10) 0) {res 1;}t / 10;}return res; }解題思路&…

AT_abc348_c [ABC348C] Colorful Beans 題解

題目傳送門 解題思路 對于每種顏色的豆子&#xff0c;我們先找到美味度最小的那個&#xff0c;最后找出這些不同種類的豆子中美味度最大的即可。 那我們怎么找到第 i i i 種豆子中美味度最小的那個呢&#xff1f;這里給出兩種思路&#xff1a; 使用桶的思想標記。對于每一…

向日葵抓住哪三個要點,幫助企業構建專業技術支持服務體系?

售后技術支持是銷售行為的延續&#xff0c;在存量時代企業是否能夠提供優質專業的售后技術支持服務顯得尤為重要&#xff0c;它直接關系到企業產品在市場中的口碑&#xff0c;進而影響企業的發展命運。 因此&#xff0c;企業勢必需要重視技術支持服務體系的搭建&#xff0c;引…

JavaScript 事件循環竟還能這樣玩!

JavaScript 是一種單線程的編程語言&#xff0c;這意味著它一次只能執行一個任務。為了能夠處理異步操作&#xff0c;JavaScript 使用了一種稱為事件循環&#xff08;Event Loop&#xff09;的機制。 本文將深入探討事件循環的工作原理&#xff0c;并展示如何基于這一原理實現一…

git-commit-id-plugin maven插件筆記(git commitId跟蹤工具)

文章目錄 maven依賴git.properties 例子 代碼版本管理比較混亂&#xff0c;如何記錄呢? 一種是手動記錄&#xff0c;也可以實現&#xff0c;顯得有點笨。 也可以通過插件。 maven依賴 <plugin><groupId>pl.project13.maven</groupId><artifactId>git…

面試題系列:Python是什么?使用Python有什么好處?你對 PEP 8 有什么理解?

###面試題系列:Python是什么?使用Python有什么好處?你對 PEP 8 有什么理解? 1、Python是什么? Python是一門動態的(dynamic)且強類型(strong)語言 延伸: 1)靜態類型語言和動態類型語言的判別的標準 如果類型檢查發生在編譯階段(compile time),那么是靜態類型語言(s…

【數據分享】水體分布與五級水系和流域矢量數據+2000-2022年植被指數(NDVI)數據(全國/分省/分市)

1. 數據介紹 數據分為3個層次結構&#xff0c;分別為省、地級市、縣。其中&#xff0c;省級水體31個&#xff08;不包含香港、臺灣等&#xff09;&#xff0c; 地級市水體366個&#xff0c;縣級市水體2847個。每一個文件夾中都包含該省、地級市或者縣的水體矢量數據、行政邊界…

數學建模 —— 灰色系統(4)

目錄 什么是灰色系統&#xff1f; 一、灰色關聯分析 1.1 灰色關聯分析模型 1.2 灰色關聯因素和關聯算子集 1.2.1 灰色關聯因素 1.2.2 關聯算子集 1.3 灰色關聯公理與灰色關聯度 1.3.1 灰色關聯度 1.3.2 灰色關聯度計算步驟 1.4 廣義關聯度 1.4.1 灰色絕對關聯…

一文讀懂GDPR

GDPR將對人們的網絡足跡、使用的APP和服務如何保護或利用這些數據產生重大影響。 下面我們將對有關GDPR人們最關心的問題進行解讀。 GDPR是什么&#xff1f; 一般數據保護條例&#xff08;General Data Protection Regulation&#xff09;是一項全面的法律&#xff0c;賦予了…