# 模块二 基础巩固 RabbitMQ 业务场景详解

## 2.6.5 RabbitMQ -- 业务场景详解 <a href="#id-265rabbitmq-ye-wu-chang-jing-xiang-jie" id="id-265rabbitmq-ye-wu-chang-jing-xiang-jie"></a>

* 异步处理
* 应用解耦
* 流量削锋
* 日志处理

### 异步处理 <a href="#yi-bu-chu-li" id="yi-bu-chu-li"></a>

* 串行方式
* 并行方式
* 异步方式

#### 串行方式 <a href="#chuan-hang-fang-shi" id="chuan-hang-fang-shi"></a>

```
_userRepo.Add(user);
_emailService.Send(user);
_smsService.Send(user);
```

#### 并行方式 <a href="#bing-hang-fang-shi" id="bing-hang-fang-shi"></a>

```
_userRepo.Add(user);

var emailTask = _emailService.Send(user);
var smsTask = _smsService.Send(user);
await Task.WhenAll(emailTask, smsTask)
```

#### 异步方式 <a href="#yi-bu-fang-shi" id="yi-bu-fang-shi"></a>

```
var user = await _userRepo.Add(user);

_eventBus.publish(new UserRegisteredEvent(){ userId = user.Id })

return user;
```

### 应用解耦 <a href="#ying-yong-jie-ou" id="ying-yong-jie-ou"></a>

订单系统 调用 库存系统

改为

订单系统 写入 消息队列

库存系统 订阅 消息队列

实现解耦

### 流量削锋 <a href="#liu-liang-xiao-feng" id="liu-liang-xiao-feng"></a>

用户的请求，服务器接收后，首先写入消息队列。假如消息队列的长度超过最大数量，则直接抛弃用户请求或跳转到错误页面

秒杀业务根据消息队列中的请求信息，再做后续处理

### 日志处理 <a href="#ri-zhi-chu-li" id="ri-zhi-chu-li"></a>

kafka：接收用户日志的消息队列

Logstash：日志解析，统一成 JSON 输出给 Elasticsearch

Elasticsearch：实时日志分析服务的核心技术，一个 schemaless，实时 的数据存储服务，通过 index 组织数据，兼具强大的搜索和统计功能

Kibana：基于 Elasticsearch 的数据可视化组件，超强的数据可视化能力是众多公司选择 ELK stack 的重要原因
