消息队列

kafka面试题整理

只愿长相守 提交于 2019-12-15 13:30:55
消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一。下面将从Kafka文件存储机制和物理结构角度,分析Kafka是如何实现高效文件存储,及实际应用效果。 1.1 Kafka的特性: - 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。 - 可扩展性:kafka集群支持热扩展 - 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失 - 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败) - 高并发:支持数千个客户端同时读写 1)每个service里面的kafka consumer数量都小于对应的topic的partition数量,但是所有服务的consumer数量之和等于partition的数量,这是因为分布式service服务的所有consumer都来自一个consumer group; 2) 如果来自不同的consumer group就会处理重复的message了。同一个consumer group下的consumer不能处理同一个partition,不同的consumer group可以处理同一个topic,那么都是顺序处理message,一定会处理重复的。

Posix 消息队列

≡放荡痞女 提交于 2019-12-15 09:12:58
文章目录 1. 基本特性 2. API介绍 2.1 创建或打开一个队列:mq_open 2.2 关闭队列:mq_close 2.3 删除队列:mq_unlink 2.4 队列的attr参数:mq_attr 2.5 向队列添加消息:mq_send 2.6 接收队列中的消息:mq_receive 2.7 消息队列由空变有时的异步消息通知:mq_notify 2.8 其他 1. 基本特性 消息队列可以认为是一个 消息链表 ,有足够权限的线程可以往队列里放消息,有足够读权限的线程可以从队列中读取消息。每个消息时一个记录,并且有一个 优先级 。 一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达 ,而管道和FIFO如果没有读者就开始写,则会产生SIGPIPE信号 管道和FIFO是 随进程的持续性 ,当管道和FIFO最后一次关闭发生时,仍在管道和FIFO中的数据会被丢弃。 消息队列是 随内核的持续性 ,即一个进程向消息队列写入消息后,然后终止,另外一个进程可以在以后某个时刻打开该队列读取消息。只要内核没有重新自举,消息队列没有被删除。 2. API介绍 2.1 创建或打开一个队列:mq_open // oflag: O_CREAT,O_EXCL,O_WRONLY, O_RDONLY,O_RDWR, O_NONBLOCK mqd_t mq_open ( const

Kafka、RabbitMQ、RocketMQ、ActiveMQ

心已入冬 提交于 2019-12-15 05:27:06
一、资料文档 Kafka:中。有kafka作者自己写的书,网上资料也有一些。rabbitmq:多。有一些不错的书,网上资料多。zeromq:少。没有专门写zeromq的书,网上的资料多是一些代码的实现和简单介绍。rocketmq:少。没有专门写rocketmq的书,网上的资料良莠不齐,官方文档很简洁,但是对技术细节没有过多的描述。activemq:多。没有专门写activemq的书,网上资料多。 二、开发语言 Kafka:Scala rabbitmq:Erlang zeromq:c rocketmq:java activemq:java 三、支持的协议 Kafka:自己定义的一套…(基于TCP) rabbitmq:AMQP zeromq:TCP、UDP rocketmq:自己定义的一套… activemq:OpenWire、STOMP、REST、XMPP、AMQP 四、消息存储 Kafka:内存、磁盘、数据库。支持大量堆积。 kafka的最小存储单元是分区,一个topic包含多个分区,kafka创建主题时,这些分区会被分配在多个服务器上,通常一个broker一台服务器。分区首领会均匀地分布在不同的服务器上,分区副本也会均匀的分布在不同的服务器上,确保负载均衡和高可用性,当新的broker加入集群的时候,部分副本会被移动到新的broker上。根据配置文件中的目录清单

三、四种集群模式

痴心易碎 提交于 2019-12-15 02:37:56
一、主备模式 也称为 Warren (兔子窝) 模式。实现 rabbitMQ 的高可用集群,一般在并发和数据量不高的情况下,这种模式非常的好用且简单。 也就是一个主/备方案,主节点提供读写,备用节点不提供读写。如果主节点挂了,就切换到备用节点,原来的备用节点升级为主节点提供读写服务,当原来的主节点恢复运行后,原来的主节点就变成备用节点,和 activeMQ 利用 zookeeper 做主/备一样,也可以一主多备。 HaProxy 配置: 注意了,上面的 rabbitMQ 集群节点配置 # inter 每隔 5 秒对 mq 集群做健康检查, 2 次正确证明服务可用,2 次失败证明服务器不可用,并且配置主备机制 二、远程模式 远程模式可以实现双活的一种模式,简称 shovel 模式,所谓的 shovel 就是把消息进行不同数据中心的复制工作,可以跨地域的让两个 MQ 集群互联,远距离通信和复制。 Shovel 就是我们可以把消息进行数据中心的复制工作,我们可以跨地域的让两个 MQ 集群互联。 如图所示,有两个异地的 MQ 集群(可以是更多的集群),当用户在地区 1 这里下单了,系统发消息到 1 区的 MQ 服务器,发现 MQ 服务已超过设定的阈值,负载过高,这条消息就会被转到 地区 2 的 MQ 服务器上,由 2 区的去执行后面的业务逻辑,相当于分摊我们的服务压力。 在使用了

11、UC IPC进程间通信

自作多情 提交于 2019-12-15 00:59:04
耦合性 代码的耦合性越低越好 内聚性 内聚性越强越好 一、IPC进程间通讯 system v IPC 使用命令ipcs可以查看system v IPC的对象 第一步:获取一个键值(唯一的值) 如果获取一个键值? 使用ftok(3)获取一个键值 # include <sys/types.h> # include <sys/ipc.h> key_t ftok ( const char * pathname , int proj_id ) ; 功能:转换pathname和proj_id为一个key值 参数: pathname:指定文件的名字 proj_id:一个整数,这个整数的低 8 位不能为 0 返回值: - 1 错误 errno被设置 成功 key值被返回 举例验证,使用ftok(3)获取一个键值 代码参见 ftok.c 如果文件名字和数字完全一样,多次运行进程产生的key值,完全一样。 第二步:通过键值获取一块内存,将这块内存id返回 第三步:通过内存的id操作这块内存 包含以下三个方面: 1、消息队列 通过键值获取一块内存,将这块内存id返回。 需要使用到msgget(2)获取内核内存的id # include <sys/types.h> # include <sys/ipc.h> # include <sys/msg.h> int msgget ( key_t key ,

系统学习消息队列分享(一) 怎样系统学习消息队列?

和自甴很熟 提交于 2019-12-14 22:33:50
从系统之间有通信需求开始呢,就产生了消息队列,它也是最古老的中间件之一。它的应用场景非常广泛,分布式系统中的很多进程间通信问题,都可以用消息队列来解决。可以说消息队列是所有后端程序员的必备技能。但是,想要系统、深入地学习消息队列,却并不容易。 要了解消息队列的完整知识体系,想深度进阶为消息队列达人,从理论到实践,从基础到进阶,从深度到广度,全方位吃透消息队列。 哪些人适合学消息队列? 后端开发者:消息队列几乎是每个后端程序员都会用到的中间件,无论你是开发微服务,实时计算,还是机器学习程序,都需要解决进程间通信的问题。 渴望技术提升的开发者:消息队列所涉及的高性能通信、海量数据存储、高并发这些底层的技术比较全面,并且功能简洁、结构清晰,容易入门但又同时具有足够的深度,非常适合用来深入分析和学习底层技术,帮助你实现从用“轮子”到造“轮子”的技术提升。 学习消息队列,有哪些门槛? 至少熟练掌握一门编程语言,掌握所有程序员都需要具备的一些基础技术知识和能力,例如: 熟练使用各种常用集合,比如:数组、链表、字典等; 掌握 Linux 系统的基础知识,会使用常用的命令; 具备多线程、并发控制编程能力; 编写过读写文件、通过网络收发数据的程序; 能看懂最基本的 UML 图,包括类图、时序图等; 了解最常用的几种设计模式和算法。 以下内容是一些“加分项”,当然这些“加分项”你不一定非要具备

rabbitmq——prefetch count

丶灬走出姿态 提交于 2019-12-14 17:10:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 消费者在开启acknowledge的情况下,对接收到的消息可以根据业务的需要异步对消息进行确认。 然而在实际使用过程中,由于消费者自身处理能力有限,从rabbitmq获取一定数量的消息后,希望rabbitmq不再将队列中的消息推送过来,当对消息处理完后(即对消息进行了ack,并且有能力处理更多的消息)再接收来自队列的消息。在这种场景下,我们可以通过设置basic.qos信令中的prefetch_count来达到这种效果。 先直观的看看设置了prefetch_count的效果,: 1) 对比测试:两个消费者都订阅同一队列,no_ack均设置为false即开启acknowledge机制,且均未设置prefetch_count,向队列发布5条消息 结果:不管消息是否被ack,rabbitmq会轮流向两个消费者投递消息,第一个消费者收到"1","3","5"三条消息, 第二个消费者收到"2","4"两条消息。 2)prefetch_count设置测试:两个消费者都订阅同一队列,开启acknowledge机制,第一个消费者prefetch_count设置为1,另一个消费者未设置prefetch_count,同样向队列发布5条消息 结果:rabbitmq向第一个消费者投递了一条消息后,消费者未对该消息进行ack

linux安装RabbitMQ教程

佐手、 提交于 2019-12-14 12:08:53
RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。 一、erlang安装   RabbitMQ是使用Erlang开发,所以安装RabbitMQ前需要先安装Erlang。 1.下载源文件 wget http://erlang.org/download/otp_src_17.0.tar.gz 2.编译安装Erlang 编译安装Erlang对环境有要求,为防止在编译的时候提示某些软件包未安装之类的错误,所以我将Erlang需要的软件提前安装,直接使用yum进行安装即可 yum -y install make ncurses-devel gcc gcc-c++ unixODBC unixODBC-devel openssl openssl-devel kernel-devel 3.解压 tar -zxvf otp_src_17.0.tar.gz 4. 编译配置Erlang ./configure --prefix=/usr/local/erlang --enable-smp-support --enable-threads --enable-sctp

亿级流量网站架构核心技术阅读笔记

此生再无相见时 提交于 2019-12-14 11:52:21
消息队列需要考虑点 消息产生失败处理 1.根据消息产品是否有重试次数,达到重试次数未成功,则会通知生产失败。 2.对于不能容忍生产失败的场景来说,要做好后期的数据处理,譬如,数据持久化,添加日志,报警等。 消息重复接收处理 1.对于消息重复问题,特别是分布式消息队列,需要在业务层面做防重处理。 来源: CSDN 作者: 奔跑的蜗牛kei 链接: https://blog.csdn.net/weixin_46021767/article/details/103536955

RabbitMQ实战-浅议与安装(一)

六月ゝ 毕业季﹏ 提交于 2019-12-14 09:59:00
RabbitMQ实战-浅议与安装(一) 1.MQ浅议 2.RabbitMQ介绍 2.1 六种队列模式 2.2 关键名词 3.安装 3.1 下载安装包 3.2 windows安装 3.3 CentOS安装 4.管理后台 1.MQ浅议 MQ是Message Queue的简称,我们也称之为消息队列。MQ是应用与应用之间的通信方法,两端的应用不进行直接调用,而是通过一方推送、一方消费的模式完成消息交换,避免了两个应用之间的依赖与耦合。 MQ框架需遵循AMQP协议,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。(粘贴自百度) 类似的MQ框架有很多,应用比较广泛的有RabbitMQ,Kafka,RocketMQ等,其中要着重介绍的是RocketMQ,它是由阿里开源并线上应用的消息框架,经过淘宝双十一等高可用场景下的考验,我司在阿里云上就购买了RocketMQ的线上应用,效果非常好。 我们今天要介绍的是另外一种MQ框架RabbitMQ,通过这张表格,我们可以比较直观的看到各MQ框架在应用场景、吞吐量等多方面的优劣,所以综合考虑,我们选择学习RabbitMQ。 2