【SpringCloudAlibaba】SpringCloudAlibaba概述
SpringCloud Alibaba 简介
【实战】RabbitMQ订单未支付x分钟自动取消
技术点
RabbitMQ: 死信队列,脑瓜子空空就点 传送门
进行回忆呗!
实现原理
1、用户下单之后,投递一个订单消息存放在订单队列里,该消息过期时间为x分钟,一直未被订单消费者消费,消息会转移到死信交换机路由到死信队列中,被我们的死信消费者x分钟后消费
2、死信消费者在根据订单号码查询支付订单状态,如果是未支付情况下,则将该订单设置未超时。
对筛选出来的订单号码进行核对校验
订单中是否存在
携带订单号码调用支付宝查询订单支付状态是否为待支付
更新该订单号码状态
超时消费流程图
代码
定义配置类
1、定义订单交换机,订单队列,设置订单交换机绑定订单队列
2、定义死信订单交换机,死信订单队列,设置死信订单交换机绑定死信订单队列
3、设置订单队列的死信订单交换机
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061@Configurationpublic class Que ...
【ES6】ES6语法
let定义变量
1、变量不可重复声明
12let star = '苹果' let star = '瓶子'//报错
2、块级作用域
大括号内都属于作用域内
1{ let girl = '周扬青' }
3、不存在变量提升
var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。
12console.log(num) // undefinedvar num = 1
let命令不存在变量提升的行为,它所声明的变量一定要在声明后使用,否则报错。
12console.log(num) // Cannot access 'num' before initializationvar num = 1
4.不影响作用域链
const 关键字
1、声明必须赋初始值
1const ONE = 1;
2、标识符一般为大写
1const ONE = 1;
3、常量值不能修改
12const ONE = 1;const ONE = 0; //报错
4、 ...
【k3s】K3s安装与部署
概述
K3s 是一个轻量级的 Kubernetes
发行版,它针对边缘计算、物联网等场景进行了高度优化。
优点
打包为单个二进制文件。
使用基于 sqlite3
的轻量级存储后端作为默认存储机制。同时支持使用
etcd3、MySQL 和 PostgreSQL 作为存储机制。
封装在简单的启动程序中,通过该启动程序处理很多复杂的
TLS 和选项。
默认情况下是安全的,对轻量级环境有合理的默认值。
添加了简单但功能强大的batteries-included功能,例如:本地存储提供程序,服务负载均衡器,Helm
controller 和 Traefik Ingress controller。
所有 Kubernetes control-plane
组件的操作都封装在单个二进制文件和进程中,使 K3s
具有自动化和管理包括证书分发在内的复杂集群操作的能力。
最大程度减轻了外部依赖性,K3s 仅需要 kernel 和
cgroup 挂载。
由来
据说希望安装的 Kubernetes 在内存占用方面只是一半的大小。Kubernetes
是一个 1 ...
【MQ】MQ概念与选用
MQ的概念
MQ(message queue),从字面意思上看,本质是个队列,FIFO
先入先出,只不过队列中存放的内容是message
而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ
是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了
MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。
消息队列的作用
1、流量消峰
举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好
2、应用解构
以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统 ...
【MQ】RabbitMQ
RabbitMQ概念
RabbitMQ
是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑
RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收存储和转发消息数据。
四大核心概念
生产者
产生数据发送消息的程序是生产者
交换机
交换机是 RabbitMQ
非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定
队列
队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经
RabbitMQ和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式
消费者
消费与接收具有相似的含义。消费 ...
【设计模式】23 种设计模式
设置模式介绍
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式的使用
设计模式在软件开发中的两个主要用途。
1) 开发人员的共同平台
设计模式提供了一个标准的术语系统,且具体到特定的情景。例如,单例设计模式意味着使用单个对象,这样所有熟悉单例设计模式的开发人员都能使用单个对象,并且可以通过这种方式告诉对方,程序使用的是单例模式。
2)最佳的实践
设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。
设计模式的类型
序号
模式 & 描述
包括
1
创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用
new
运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
工厂模式(Factory
Pattern) 抽象工厂模式(A ...
【nginx】反向代理与负载均衡
Nginx
Nginx同Apache一样都是一种WEB服务器,基于REST架构风格,以统一资源描述符(Uniform
Resources Identifier)URI或者统一资源定位符(Uniform Resources
Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。
然而,这些服务器在设计之初受到当时环境的局限,例如当时的用户规模,网络带宽,产品特点等局限并且各自的定位和发展都不尽相同。这也使得各个WEB服务器有着各自鲜明的特点。
Apache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的。它是不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。
这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx就应运而生了。
俄罗斯的工程师Igor Sys ...
【mysql】并发与事务
事务(Transaction)及其
ACID属性
事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性
原子性(Atomicity):事务是一个原子操作单元,对其数据的修改,要么全都执行,要么全都不执行
一致性(Consistent):
在事务开始和完成时,数据必须保持一致状态。这意味着所有相关的数据都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有内部数据结构(如B树索引或双向链表)也都必须是正确的。
隔离性(lsolation):
数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
持久性(Durable) :
事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持
并发事务处理带来的问题
更新丢失(Lost Update)
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题一一最后的更新覆盖了由其他事务所做的更新。
例如,两个程序 ...