RabbitMQ梳理
介绍RabbitMQ 是一个在 AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。它具有消息队列的所有基本属性特征和优点,比如可以用来做异步、削峰、解耦,可以用来做定时任务,事务顺序等等,可以用于大型企业通信,支持高并发、支持可拓展。 RabbitMQ 是使用 Erlang 编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。它同时实现了一个 Broker 构架,这意味着消息在发送给客户端时先在中心队列排队,对路由(Routing)、负载均衡(Load balance)或者数据持久化都有很好的支持。 rabbitMq核心概念前面概念于MessageQueue记录了 死信队列什么是死信队列?当一条消息在队列中出现以下三种情况的时候,该消息就会变成一条死信。 消息被拒绝(basic.reject / basic.nack),并且requeue =...
负载均衡
什么是负载均衡?负载均衡指的是将用户的请求分摊到不同的服务器上处理,以提高系统的整体并发处理能力和可靠性。负载均衡可以有专门的软件和硬件来完成,一般情况下,硬件的性能和稳定性更好,但是太贵了,所以一般使用软件的负载均衡 负载均衡分类负载均衡可以简单分为 服务端负载均衡 和 客户端负载均衡 这两种 服务端负载均衡服务端负载均衡就是在服务端引入一个独立的负载均衡器(如 Nginx、LVS、Envoy、F5),由它来接收客户端请求并分发到后端实例。它可以分为 二层负载均衡, 四层负载均衡, 七层负载均衡, 六层负载均衡,其中 四层负载均衡(基于 TCP/UDP,性能高,但只能做转发)和 七层负载均衡(基于 HTTP/HTTPS,可以根据 URL、Header 做复杂策略)。常见算法有轮询、加权轮询、最少连接、一致性哈希等。在实际生产环境中,服务端负载均衡不仅负责流量分发,还要做健康检查、容灾、会话粘性和灰度发布。 四层负载均衡四层负载均衡,也就是传输层(针对TCP/UDP)主要是...
Java并发 --volatile关键字
volatile概述 在Java并发中,volatile可以保证变量的可见性,如果我们将变量声明为volatile,就指示JVM,这个变量是共享且不稳定的,每次使用都需要从主存中读取 注意到volatile并不能保证原子性,所以对于多次写的情况下不适合用volatile,容易造成数据丢失问题,单独使用volatile一般可以用来操作一些开关,多次读一次写的对象,如: 12345678910111213public class Button { public volatile boolean isopen = true; public void run() { while (isopen == true) { // 逻辑操作 } } public void stop() { isopen = false; ...
RPC
1. 应用使用.thrift可以实现功能接口的跨语言调用,客户端可以通过连接RPCclient实现调用服务端的实现接口以Go为服务端,Python为客户端 1. thrift:12345678910111213141516171819202122service DevelopManagementService { // Create a work ticket for deployment CreateTicketResponse CreateTicket(1: CreateTicketRequest req)}// Ticket API Beginstruct CreateTicketRequest { 1: required string Branch // RD - Git DevBranch 2: required string EntityURI 3: required bool Hotfix 4: required string Operator 5: optional string...
DNS协议
DNS是应用层协议,基于UDP协议, 端口为53 域名结构树例如 www.baidu.com 从后面往前面看,实际上这个域名是www.baidu.com.root, 表示又root管理的com下的baidu的www(主站, 同一级别的还有mail, member,space) 根域名服务器:上面的root就是根域名服务器, 现在有13个, 发送一个请求后,通过任播找到最近的根域名服务器顶级域名服务器:之后根域名服务器会去顶级域名服务器(top level domain, 简称TLD), 有com, cn, net, gov等等权威域名服务器:比如baidu, qq, bilibili等,又顶级域名服务器管理主机: 本地主机 DNS工作流程 DNS查询过程分为两种模式: 迭代: 本地DNS使用轮询迭代的方式查询IP 递归: 浏览器向本地DNS查询IP 和 本地DNS返回浏览器IP使用的是递归的过程 第一步:拿到请求,解析请求响应,发送到解析器DNS客户端(看成一个程序)第二步:解析器发送解析请求到本地DNS服务器(由于本地网络有DNS服务器的IP,...
2024CCPC重庆题解
J. 筛子在n行m列的网格的最左上角的格子上,有一个边长和网格格子边长相等的骰子。 初始,这个骰子1在顶面,2朝前,3朝右,i的背后是7−i, 现在你可以做任意多次操作,每次操作为以下两种:• 若当前骰子所在的格子没有数字,在这个格子上写下骰子底面的数字;• 选择上下左右四个方向的某一个,将骰子沿着这个方向滚一次:选择骰子底面对 应方向的棱,将骰子沿着这条棱旋转九十度。你不能将骰子滚出网格。 . 注.意: .你 .可 .以 .在 .骰 .子 .经 .过 .一 .个 .没 .有 .数 .字 .的 .格 .子 .时 .选 .择 .不 .在 .这 .个 .格 .子 .上 .写 .下 .骰 .子 .底 .面 . 的.数 .字。 你希望最大化最后网格上所有写过数字的格子的数字的和。 解 注意到只要有 2 2的空间,那么经过一系列操作后所有格子都必然可以刻上数字6, 所有只要有一个 2 2空间答案就是 6 * 格子数量,...
操作系统 --进程与线程篇
进程和线程区别 进程(Process) 操作系统资源分配的基本单位 每个进程有自己独立的地址空间(代码段、数据段、堆、栈) 程序一旦运行,就会至少有一个进程 切换开销大,因为需要切换整个内存地址空间、文件描述符等上下文 线程(Thread) 程序执行的最小单位,是 CPU 调度的基本单位 一个进程可以包含多个线程 线程共享进程的地址空间,但有自己独立的栈和寄存器 切换开销小,多个线程共享进程资源,只需切换少量上下文(寄存器、栈指针) 👉 直观类比: 进程 = 公司(独立运作,有资源) 线程 = 公司里的员工(共享公司资源,但干不同的活) ...
操作系统 --基础篇
操作系统的内核(Kernel)和中央处理器(CPU,Central Processing Unit)区别: 操作系统的内核(Kernel)属于操作系统层面,而 CPU 属于硬件。 CPU 主要提供运算,处理各种指令的能力。内核(Kernel)主要负责系统管理比如内存管理,它屏蔽了对硬件的操作。 下图清晰说明了应用程序、内核、CPU 这三者的关系。 用户态和内核态 用户态: 用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限,当需要执行某些特殊权限的时候,例如读写磁盘,网络通信,就需要向操作系统申请资源权限。 内核态: 内核态的权限很大,几乎可以完成对系统的所有操作 操作系统得到指令后,会从用户态转移到内核态,执行对磁盘的操作后将结果返回进程,后转回用户态 虽然拥有更高的权限,但是由于进入内核态时候的上下游调用,开销花费较大,所以要尽量减少进入内核态的次数 用户态: 应用程序,库函数内核态: 进程管理,网络管理,数据管理,内核管理, 设备管理 为什么要有用户态,只要一个内核态不行吗?答: 内核态:CPU...
Go光速入门
Go语言基本语法与使用一、变量 变量声明Go中的变量声明和Java中有所不同,主要有一下几种格式 标准格式 1var 变量名 变量类型 以关键字var开头,最后不用加分号 批量声明 如果我们要声明多个变量,一个一个的声明会比较繁琐,这时就有了批量声明 12345var( 变量1 变量类型 变量2 变量类型 ......) 变量初始化Go语言在声明变量时,自动对变量对应的内存区域进行初始化工作。也就是说,如果我们声明了变量而没有赋值,那么**编译器**会给变量赋各个类型对应的零值。和Java不同,Java只会对成员变量和常量赋默认零值,对于局部变量则会报错 标准格式 1var 变量名 变量类型 = 表达式 类型推导 由于Go是强类型语言,其实我们可以通过给变量赋的值来推导出变量的类型,这就是所谓的类型推导,于是就有了我们下面的这种写法: 1var 变量名 =...
