no message

This commit is contained in:
fanxb 2019-01-28 19:55:40 +08:00
parent 817a41d69e
commit 804a98f6d8
6 changed files with 123 additions and 1 deletions

View File

@ -0,0 +1,32 @@
---
id="2019-01-03-19-19"
title="springCloud学习4Spring-Cloud-Stream事件驱动"
headWord="像微服务这样的分布式架构中,需要确保跨多个服务调用的关键行为(如安全、日志记录、用户跟踪等)能够正常运行,这就需要一个服务网关来统一处理。"
tags=["spring-boot", "spring-cloud","spring-cloud-stream","kafka","事件驱动"]
category="java"
serie="springCloud实战"
---
  想想平常生活中做饭的场景,在用电饭锅做饭的同时,我们可以洗菜、切菜,等待电饭锅发出饭做好的提示我们回去拔下电饭锅电源(或者什么也不知让它处于保温状态),反正这个时候我们知道饭做好了,接下来可以炒菜了。从这里可以看出我们在日常生活中与世界的互动并不是同步的、线性的,不是简单的请求--响应模型。它是事件驱动的,我们不断的发送消息、接受消息、处理消息。
  同样在软件世界中也不全是请求--响应模型也会需要进行异步的消息通信。使用消息实现事件通信的概念被称为消息驱动架构Event Driven Architecture,EDA也被称为消息驱动架构Message Driven Architecture,MDA。使用这类架构可以构建高度解耦的系统该系统能够对变化做出响应且不需要与特定的库或者服务紧密耦合。
  在Spring Cloud项目中可以使用**Spirng Cloud Stream**轻而易举的构建基于消息传递的解决方案。
# 1、为什么使用消息传递
  要解答这个问题让我们从一个例子开始之前一直使用的两个服务许可证服务和组织服务。每次对许可证服务进行请求许可证服务都要通过http请求到组织服务上查询组织信息。显而易见这次额外的http请求会花费较长的时间。如果能够将缓存组织数据的读操作将会大幅提高许可证服务的响应时间。但是缓存数据有如下3个要求:
- **缓存的数据需要在许可证服务的所有实例之间保存一致**——这意味着不能将数据缓存到服务实例的内存中。
- **在更新或者删除一个组织数据时,许可证服务缓存的数据需要失效**——避免读取到过期数据,需要尽早让过时数据失效并删除。
  要实现上面的要求,现在有两种办法。
1. 使用同步请求--响应模型来实现。组织服务在组织数据变化时调用许可证服务的接口通知组织服务已经变化,或者直接操作许可证服务的缓存。
2. 使用事件驱动。组织服务发出一个异步消息。许可证服务收到该消息后清除对应的缓存。
## 1.1、同步请求-响应方式
  对于组织服务的缓存使用Redis来进行存储。下图展示了传统的同步请求--响应来构建的缓存。

View File

@ -0,0 +1 @@
<mxfile modified="2019-01-18T05:12:36.853Z" host="www.draw.io" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/9.3.1 Chrome/66.0.3359.181 Electron/3.0.6 Safari/537.36" etag="N256S-eO6hUqJeOGiOxy" version="10.1.0" type="device"><diagram id="9zkqc596u_c2AOWQja2X" name="第 1 页">3VnbcqM4EP0aPc4UILDhEWy8qansbiqZqtnZNwwKaEZGLiHf8vUrCXG3Hc/Ejr3JQ0pqdQvRp093CwM4WWz/YNEy+5MmiADLSLYAToFledAQ/6VgVwpGjlUKUoaTUmQ2gif8grRQ26UrnKCio8gpJRwvu8KY5jmKeUcWMUY3XbVnSrpPXUYpGgie4ogMpd9wwrNSCqFhNAt3CKeZfrRY8sqVRVRpa9UiixK6aYlgCOCEUcrL0WI7QUQ6r3JMaTc7sFqfjKGcn2LwmD2O7v4yXtY//OWXEL083H3799NYn43vqjdGiXCAnlLGM5rSPCJhIw0YXeUJkrsaYpbxBRFDUwzFQdjuHy1Xk+9y8tmpptNte3G607MfiPOdxj5acSpEzZPvKV3q/cuzygMedIEWFXTFYnTkvatYiliK+BE9WAMlIhzRBRLnFnYMkYjjdfcckY61tNZr0BADDcgvgKP3XUdkpZ8EQhf4IQhcEDrAnQF/piQz4JogHAFvAtypWvKBb8qBUPYtueS6IBiDcAz8QOr3URfBuZTD1YL4MadMeHuNGMeCCffRHJEHWmCOaS5U5pRzuhAKRC4EUfwzVRExoUTaid3gs/pr7eETnEpbLrFshwxdcYJzNKnpa9Q4S1u0PY70EJnKoCKozjt1Qtm0WKxFWYu/I+NSWDoXYZp580yzTmSafU2mWXuYNgZBAFy7Gox/kWAjIt42mDMxSrly6VDywUk4tuwbI6Ex8PkbSHgFMsH/BZngwMsntAxN7vreXrudRHaq7y3rms6Hb+wZjiO3yTBHT8tIOWojOv4ummfIGZb9euE2rXdNGsNwPkuPfPMBb79Tj6xMfcaiXUthSXHOi9bOD1LQxInTjxOvd/vp6cN+Q9jVF4PyBE2c1K/y+6Fj/15bcW0O2u7NcfDAVWgmfSj9JhoxR3nSAYGh2rGpTHp9Twqf8K67GCrwSzRXCtK7Ou6EthMAZyokkm1FSTxpEOkuiqBnfrC5KgQ8OE+/KlqKMDgPLIbZg8UewDLag4p1MVT2xfdIVhqBR+gBzwN+GegT4EHVLU+B5340VPqJxbkuKtYwgbxDkxuv2FrZn/v6aJxYhQ6g9E4tr/HGtuvITbI095SOKBeBX2U+VToCE7jKyodApG1JNlvtc/jpr9Ov4Iz+RNVdMqe5DJFnTEhPVLEuFrAitod3C5wkKr72Fa1uzJ2Biv2PPnA8rFveHio6F6Pi8LvCI0pwMYCguvnHO3ERT5QrXynz89J59/NaUH8D+Lu8zp+xJx93/eoM3bovw7kXc+v+uqMZILg1U93Ax6470IAdUMyRdam6I6bNzxRlb9z82APD/wA=</diagram></mxfile>

View File

@ -1,6 +1,6 @@
--- ---
id="2018-10-03-10-58" id="2018-10-03-10-58"
title="正则匹配之正向/反向预测先行搜索" title="分布式事务"
headWord="分布式听说很火但是分布式事务有很难解决so来了解了解" headWord="分布式听说很火但是分布式事务有很难解决so来了解了解"
tags=["分布式","sql","2PC","TCC","异步补偿"] tags=["分布式","sql","2PC","TCC","异步补偿"]
category="数据库" category="数据库"

View File

@ -0,0 +1,89 @@
---
id="2019-01-25-09-48"
title="mysql使用查询结果进行插入操作"
headWord="经常在使用mysql的过程中想要从一张表中查出一些数据插入到另一张表中操作如下。"
tags=["mysql","select","insert"]
category="数据库"
serie="分布式事务"
---
**本篇原创发布于:**[FleyX 的个人博客](tapme.top/blog/detail/2019-01-25-09-48)
&emsp;&emsp;经常在使用 mysql 的过程中想要从一张表中查出一些数据插入到另一张表中,操作如下。
# 1、方法
&emsp;&emsp;使用 insert ... select ...操作。要求两边参数个数,参数类型完全一致,所以如果不一致就需要进行一些转换操作来让它一致。例子如下:
&emsp;&emsp;从表 B 中查数据插入到表 A 中。
1. A 表字段多B 表字段少
```javascript
//A表结构
A:{
a:int,
b:int,
c:int
}
//B表结构
B:{
a:int,
b:int
}
```
sql 语句如下:
```sql
insert into A(a,b,c) select b.*,1 from B b;
```
&emsp;&emsp;由于 B 表比 A 表少了一个 int 型参数 c所以在 select 语句中加上一个数值补齐。
2. A 表字段少B 表字段多
```javascript
A:{
a:int,
b:int
}
B:{
a:int,
b:int,
c:int
}
```
sql 语句如下:
```sql
insert into A(a,b) select a,b from B
```
&emsp;&emsp;A 表只有两个 int 参数,所以只能从 B 中 select 两个参数,不一定是 a,b。也可以是 a,c 只要参数类型,个数一致就行。
3. AB 表字段一致,但是类型不一致
```javascript
//A表结构
A:{
a:int,
b:int
}
//B表结构
B:{
a:string,
b:int
}
```
sql 语句如下:
```sql
insert into A(a,b) select (cast a as SIGNED),b from B
```
&emsp;&emsp;使用类型转换将参数类型转换为一致即可。
**本篇原创发布于:**[FleyX 的个人博客](tapme.top/blog/detail/2019-01-25-09-48)