rmq

RocketMQ 核心原理,这篇文章讲透了!

百般思念 提交于 2020-08-09 13:31:09
回复“ 1024 ”获取 2000+ 道互联网大厂面试题 如何把开源项目用好,很大程度上是由学习路径决定的: a. fork下来,起一个demo,上一个测试环境,遇到问题再去社区提问或找些实践文章; b. 把官方文档通读一遍,理解下产品、特点和应用场景; c. 先看一遍源代码,理解清楚其中的代码逻辑; d. 看源代码太费劲,找本社区推荐的书系统的梳理下; 本文来自 Apache RocketMQ 的资深用户丁威,他和 MyCat 的核心开发者周继锋合著了《RocketMQ技术内幕:架构设计与实现原理》一书, 目的是希望用图解的方式梳理 RocketMQ的核心原理 ,包括 RocketMQ Topic 的路由注册与剔除机制、消息发送高可用设计、消息存储文件设计、并发消息拉取与消息消费流程、主从同步(HA)、事务消息基本实现原理等,帮助开发者在使用 RocketMQ 的同时,还能对其核心原理了然于心 。 Topic 的路由机制 介绍路由注册机制之前,先简单看下 RocketMQ 的整体架构: Producer: 消息生产者,用于向消息服务器发送消息; NameServer: 路由注册中心; Broker: 消息存储服务器; Consumer: 消息消费者,该流程图中未涉及; 联通性: A. NameServer 之间互不通信,无法感知对方的存在。 B. Producer 生产者与

RabbitMQ学习-简单DEMO实现

回眸只為那壹抹淺笑 提交于 2020-08-08 20:54:56
介绍: RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间件之一。(官网: http://www.rabbitmq.com ) AMQP,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,同样,消息使用者也不用知道发送者的存在。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。   消息队列的使用过程大概如下:     (1)客户端连接到消息队列服务器,打开一个channel。     (2)客户端声明一个exchange,并设置相关属性。     (3)客户端声明一个queue,并设置相关属性。     (4)客户端使用routing key,在exchange和queue之间建立好绑定关系。   (5) 客户端投递消息到exchange。exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。     P: 为Producer,数据的发送方。     C:为Consumer,数据的接收方。     Exchange:消息交换机

消息中间件之:Kafka、ActiveMQ、RabbitMQ、RocketMQ

不打扰是莪最后的温柔 提交于 2020-07-28 07:16:28
《一》kafka的工作原理介绍 《二》zk搭载kafka分布式消息队列浅析 一、简介 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。 二、消息中间件的组成 2.1 Broker 消息服务器,作为server提供消息核心服务 2.2 Producer 消息生产者,业务的发起方,负责生产消息传输给broker, 2.3 Consumer 消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理 2.4 Topic 主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的 广播 2.5 Queue 队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收 2.6 Message 消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输。 三、主流消息中间节分类 kafka 1、不完全符合jms规范,注重吞吐量,类似udp 和 tcp 2、一般做大数据吞吐的管道 我们现在的用途就是负责在各个idc之间通信 3、量大对数据不是百分之百保证的,会有数据丢失,不是百分百送达(amq和rmq等有重发机制,而kafka没有);在吞吐量有提升

whu-contest-2019(online)

最后都变了- 提交于 2020-05-08 03:55:49
比赛网址:http://whu2019.contest.codeforces.com/group/YyBKO8xFiH/contest/102167 赛后总结: T:今天参加了武汉大学校赛网络赛,在cf上做的。界面还是挺熟悉的。开始三个人分头看题,我从最后往前面看,最后一题是kuangbin的主席树模板题,觉得打板子时间有点长,先看有没有别的简单题。然后就看到了E,E题就是一道简单模拟题。map存一下,模拟即可,然后就A了。然后是金姐看了B题,开始打了,也A了。这次我们第一题A花了16分钟,第二题是在第一题后6分钟A的,时间有在进步吧。别的题因为一下子想不出来,我就开始搞F题了。然后板子上的是求第m小的,所以改了很久(丢人。。。),金姐后来帮我一起改,金姐发挥了她的智慧,我们终于搞样例出来了。。呜呜。然后TLE了,因为链式前向星head赋值的问题,for改了就过了。做出来的时候已经只剩下一个小时了,我们开始研究D题。金姐和彭彭和我说觉得是规律算式题,我们整了很久,都没整出来。有点像组合数学,但是没搞出来。今天就结束了。   最后比赛结束看到群里很多大佬在讲解题目。发现有很多未触及的知识盲区。想着自己如果主席树模板搞快点就可以和队友一起想更久了。dbq。 P:看的第一题是C题,后来才知道是线段树上二分。然后看了B题,谭总敲完E,金姐就去打B了,我跟谭总说了一遍B题题意

单调队列优化DP(超详细!!!)

隐身守侯 提交于 2020-05-08 03:29:55
一、概念 1、单调队列定义:    其实单调队列就是一种 队列内的元素有单调性 (单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素。因为其单调性所以经常会被用来维护区间最值或者 降低DP的维数 已达到降维来减少空间及时间的目的。 单调队列的一般应用:      维护区间最值      优化DP 【例一】 求m区间内的最小值(洛谷 P1440) 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。 输入格式 第一行两个数n,m。 第二行,n个正整数,为所给定的数列。 输出格式 n行,第i行的一个数ai,为所求序列中第i个数前m个数的最小值。 输入 6 2 7 8 1 4 3 2 输出 0 7 7 1 1 3 思路: 1、暴力枚举以i-1为结尾的前m个数。时间O(n*m),T T T. 2、rmq求解O(nlog n) 貌似会T 3、线段树求解 O(nlog n) 当n=1e7时也超时,空间,代码量大 需要更优的O(n)的解法处理。 4、单调队列来了 因为每一个答案只与当前下标的前m个有关,所以可以用单调队列维护前m个的最小值,    考虑如何实现该维护的过程??    显然当前下标X的m个以前的元素(即下标小于X-M+1的元素

P1440 求m区间内的最小值

风流意气都作罢 提交于 2020-05-08 02:25:07
原题链接 https://www.luogu.org/problemnew/show/P1440 今天下午本来想刷一道ST表的题温习一下RMQ问题,点开算法标签找到了这个题。 草草看了一下题面,果然是RMQ问题,只不过询问区间的方式不一样了qwq。 自信的我打上了ST表模板,可是只有80分,有两个点MLE了: #include<iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; int read() { char ch= getchar(); int a= 0 ,x= 1 ; while (ch< ' 0 ' ||ch> ' 9 ' ) { if (ch== ' - ' ) x=- x; ch = getchar(); } while (ch>= ' 0 ' &&ch<= ' 9 ' ) { a =(a<< 3 )+(a<< 1 )+(ch- ' 0 ' ); ch = getchar(); } return a* x; } int n,m; int a[ 2000001 ],f[ 2000001 ][ 20 ]; int main() { n =read();m= read(); for ( int i= 1 ;i<=n;i++ ) { a[i] = read

lca最近公共祖先与树上倍增。

房东的猫 提交于 2020-05-06 06:51:35
https://vjudge.net/contest/295298#problem/A lca 的题目 求任意两点的距离。 A题是在线算法,用st表rmq来实现。 https://blog.csdn.net/nameofcsdn/article/details/52230548 相当于先把整个树dfs一遍,记录整个dfs过程中的点(可重复,相当于dfs序,按顺序排好所有的点),并且记录每个点第一次被遍历到的得dfs序, 然后两个点的最近公共祖先就是第一次被遍历到的下标之间点深度最小的那个点。 1.最原始的lca(可以遍历到两点到lca之间所有的点,有些题目需要(后来发现并不需要,因为可以树上倍增)) int lca( int u, int v) { if (dep[u] < dep[v]) swap(u, v); while (dep[u] > dep[v]) { u = pa[u]; }//先让两个点到达同一深度。 while (u != v) { v = pa[v]; u = pa[u]; }//两个点一起向上走,知道走到同一点就是lca。   return u; } 在线做法复杂度nlogn。 #include<cstdio> #include <cstring> #include <algorithm> #include<vector> using namespace

Training for 分块&莫队

对着背影说爱祢 提交于 2020-05-05 20:00:01
分块 Study data Link:http://hzwer.com/8053.html // hzwer讲的很好很全 树上莫队Study Link:http://codeforces.com/blog/entry/43230 ( ery nice 并且有题目推荐 莫队算法时间复杂度O( n * sqrt(n) )证明: 由于每一块的大小为sqrt(n),故有sqrt(n)块,按照所属块为first key ,右端点为second key,考虑每一块,因为每块的右端点是Increase,故右端点最大的移动为N ,左端点的最大移动为 k × sqrt(n),故总复杂度为O(n×sqrt(n) + m×sqrt(n)) ≈ O( n * sqrt(n) ) 一道很牛逼的题 题意 给一个n的数的序列,现有q次询问, 1代表是修改操作,2代表是查询操作,对于每次查询输出[1,1e6]以内出现偶数次最小的树(没有出现也算是偶数次) (a[i],n,q<=1e6) 分析 对[1,1e6]分块,每次修改之前的数所在的块和修改后所在的块即可 代码:待补 CDOJ 1324 分析 简单的单点更新,区间最大值 时间复杂度( n×sqrt(n) ) #include<iostream> #include<cstdio> #include<cstring> #include<cmath>

RMQ算法详解

和自甴很熟 提交于 2020-05-05 16:52:47
RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法。 当然这个问题用线段树同样能够解决,算法复杂度为:O(N)~O(logN) 。 RMQ: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A, 回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。 分析: 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大且查询很频繁时,该算法无法在有效的时间内查询出正解。 本节介绍了一种比较高效的在线算法(ST算法)解决这个问题。所谓在线算法,是指用户每输入一个查询便马上处理一个查询。该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询。ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法 预处理: 设A[i]是要求区间最值的数列,F[i, j]表示从第i个数起连续2^j个数中的最大值。(DP的状态) 例如: A数列为:3 2 4 5 6 8 1 2 9 7 F[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。同理 F[1,1] = max(3,2) = 3, F[1,2]=max(3,2,4,5) = 5,F[1,3] =

2017年NOIP普及组复赛题解

半城伤御伤魂 提交于 2020-05-04 06:42:56
题目涉及算法: 成绩:入门题; 图书管理员:模拟; 棋盘:最短路/广搜; 跳房子:RMQ/二分答案/DP(本人解法)。 成绩 题目链接: https://www.luogu.org/problemnew/show/P3954 入门题,直接计算一下即可。 实现代码如下: #include <bits/stdc++.h> using namespace std; int a, b, c; int main() { cin >> a >> b >> c; cout << (a * 2 + b *3 + c * 5) / 10 << endl; return 0; } 图书管理员 题目链接: https://www.luogu.org/problem/P3955 基础题目,实现代码如下: #include <bits/stdc++.h> using namespace std; bool check(int a, int b, int n) { int t = 1; for (int i = 0; i < n; i ++) t *= 10; return a % t == b % t; } int n, m, book[1001], x, y; int main() { cin >> n >> m; for (int i = 0; i < n; i ++) cin >> book[i];