mq

POSIX消息队列

旧街凉风 提交于 2019-11-29 01:51:10
POSIX消息队列概述 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。 消息队列和管道和FIFO有很大的区别,主要有以下两点: 一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相反的,进程向其中写消息时,管道和FIFO必需已经打开来读,否则写进程就会阻塞(默认情况下),那么内核会产生SIGPIPE信号。 IPC的持续性不同。管道和FIFO是随进程的持续性,当管道和FIFO最后一次关闭发生时,仍在管道和FIFO中的数据会被丢弃。消息队列是随内核的持续性,即一个进程向消息队列写入消息后,然后终止,另外一个进程可以在以后某个时刻打开该队列读取消息。只要内核没有重新自举,消息队列没有被删除。 消息队列中的每条消息通常具有以下属性: 一个表示优先级的整数 消息的数据部分的长度 消息数据本身 POSIX消息队列的一个可能的设计是一个如下图所示的消息链表,链表头部有消息队列的属性信息。 ​ POSIX消息队列的创建和关闭 POSIX消息队列的创建,关闭和删除用到以下三个函数接口: #include <mqueue.h> mqd_t mq_open(const char *name, int oflag, /* mode_t mode, struct mq_attr *attr */); /

[喵咪KafKa(1)]KafKa的介绍以及使用场景

我只是一个虾纸丫 提交于 2019-11-29 01:49:08
[喵咪KafKa(1)]KafKa的介绍以及使用场景# 前言## 哈喽!大家好呀,真是一坑未平一坑又起,otter还在继续更新的同时,笔者也为大家带来了关于kafka相关的一系列博客,要说到kafka就离不开现在特别火热的大数据技术,了解的童鞋可能只要一些大数据的带名词比如 Hadoop,spark,storm ,包括最近很火的微服务,kafka也是其中一员,但是不同的是kafka并不负责处理数据,要给kafka一个定义的话应该是一个 分布式发布订阅消息系统 可以说是一个数据通道保证数据稳定传输,要是感兴趣就开始和喵咪开始一场kafka的冒险吧! 附上: 喵了个咪的博客: w-blog.cn KafKa官网地址: http://kafka.apache.org/ Git地址: https://github.com/apache/kafka 1. KafKa简介## 初识KafKa 笔者是怎么了解到KafKa的呢?其实这个也源于InfoQ大会的功劳(InfoQ大会是一个技术架构分享峰会),在之间有很多大家耳熟能详的公司来分享一些技术,大家在谈论大数据技术的时候使用到了本文开篇提的 Hadoop,spark,storm 此类技术,但是他们都要有一个共同点,就是大部分使用了 KafKa 作为了数据传输的通道,并且还有很多不需要使用到大数据的公司也在使用KafKa

主要内容如producer的confirm和consumer的ack

萝らか妹 提交于 2019-11-29 00:44:45
本篇和大家分享的是关于rabbit的生产和消费方的一些实用的操作;正如文章标题,主要内容如producer的confirm和consumer的ack,这两者使用的模式都是用来保证数据完整性,防止数据丢失。 producer的confirm模式 consumer的ack模式 producer的confirm模式 首先,有这样一种业务场景1:a系统在做活动前,需要给用户的手机发送一条活动内容短信希望用户来参加,因为用户量有点大,所以通过往短信mq中插入数据方式,让短信服务来消费mq发短信; 此时插入mq消息的服务为了保证给所有用户发消息,并且要在短时间内插入完成(因此用到了异步插入方式(快速)),我们就需要知道每次插入mq是否成功,如果不成功那我们可以收集失败的信息后补发(因此confirm模式排上了用场);如图设计: 在springboot中可以使用基于amqp封装的工厂类来开启confirm模式,然后通过RabbitTemplate模板来设置回调函数,如下代码: 复制代码 1 ///region producer生产 - confirm模式 2 3 public RabbitTemplate getRabbitTemplate(RabbitTemplate.ConfirmCallback confirmCallback) { 4 return this

Most Efficient - Performance wise - for inter JVM communication

拟墨画扇 提交于 2019-11-28 23:20:24
问题 I have a Java application that require communication between different process. Process could run in same JVM or different JVM, but runs on the same machine. My application need to submit "messages" to another process (same or different JVM) and forgot about it. similar to messaging queue like IBM "MQ", but simple, and only use memory, no IO to hard disk for performance gains. I'm not sure what is the best approach from Performance prescriptive. I wonder if RMI is efficient in terms of

(转)RocketMQ工作原理

廉价感情. 提交于 2019-11-28 22:10:23
原文: https://blog.csdn.net/lyly4413/article/details/80838716 1.消息中间件的发展: 第一代以ActiveMQ为代表,遵循JMS(java消息服务)规范 第二代以RabbitMQ为代表是一个有Erlang语言开发的AMQP(高级消息队列协议)的开源实现 第三代以kafka为代表,是一代高吞吐、高可用的消息中间件,以及RocketMQ RocketMQ的特点: 1.RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点: 2.能够保证严格的消息顺序 3.提供丰富的消息拉取模式 4.高效的订阅者水平扩展能力 5.实时的消息订阅机制 6.亿级消息堆积能力 7.分布式高可用的部署架构,满足至少一次消息传递语义 8.提供 docker 镜像用于隔离测试和云集群部署 9.提供配置、指标和监控等功能丰富的 Dashboard 选用理由: a.强调集群无单点,可扩展,任意一点高可用,水平可扩展。 b.海量消息堆积能力,消息堆积后,写入低延迟。 c.支持上万个队列 d.消息失败重试机制 e.消息可查询 f.开源社区活跃 g.成熟度(经过双十一考验) RocketMQ物理部署结构: rocketMQ几个概念: producer:消息生产者,生产者的作用就是将消息发送到 MQ,生产者本身既可以产生消息,如读取文本信息等

如何调整MQ的吞吐量

夙愿已清 提交于 2019-11-28 18:04:46
1. kafka和RocketMQ一个cosumer可以消费多个分区/队列 (平摊) 比如有8个分区/队列,三个消费者机器,那么每个消费者消费的分区/队列的个数分别是 3、3、2: 2. 单机多线程消费: RocketMQ 设置某一个单例的consumer 对象的Pool Thread Num 来实现多线程消费,内部实现了一个ThreadPoolExcutors(setConsumeThreadMin、setConsumeThreadMax); kafka里面的consumer是线程不安全的,只能在一个thread里面pull,但是可以同时创建多个线程,每个线程里面实例化一个consumer实现多线程消费。无论是Kafka还是RocketMQ,他们同时消费的能力是受限于分区或者队列的数量。 但是单机多线程消费一定要控制好线程数量,避免数量设置的过多导致CPU负载过高,就失去了MQ的削峰填谷的作用. 3. 根据消费服务的机器配置、消费速度、容忍的消费延时 “反推”应该配置多少分区. 机器配置高,消费速度快 ,cpu总是闲着,那么就增加分区,然后增加kafka单机cosumer数量 机器配置差,消费速度慢,消费延时太高了,那么也增加分区,然后服务扩容几台机器 来源: https://my.oschina.net/u/4129361/blog/3098239

RabbitMQ的第一次亲密接触

泄露秘密 提交于 2019-11-28 15:27:20
企业应用系统,如果系统之间的通信、集成与整合,尤其当面临异构系统时,那么需要分布式的调用与通信。系统中一般会有很多对实时性要求不高但零零碎碎且耗时的地方,比如发送短信,邮件提醒,记录用户操作日志等,在用户访问量比较大的情况下,对系统压力比较大。 面对这些问题,我们一般会将这些请求,放在消息队列MQ中处理;异构系统之间使用消息进行通讯。 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。 http://www.rabbitmq.com/download.html 下安装服务端,由于RabbitMQ使用Erlang语言编写,所以先安装Erlang语言运行环境 http://www.erlang.org/ ,按照网上的操作要求安装和配置环境变量,命令行执行指令浏览器如下管理界面: 因为我要用C#语言做个简单的验证,所以需要API支持,如下地址下载https://www.rabbitmq.com/releases/rabbitmq-dotnet-client

SpringBoot简单使用RabbitMQ消息组件

[亡魂溺海] 提交于 2019-11-28 10:56:11
1 在虚拟机中安装rabbitmq 2 开启rabbitmq 3 页面查看rabbitmq 3 rabbitmq相关知识点讲解 [1] MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。 1、队列、生产者、消费者 队列:mq内部存储信息的 生产者:产生信息的 消费者:消费消息的 2、Exchange、Binding exchange:交换器,交换按照一定规则与对列绑定,消息才能到queue中 Binding用routing key 3、Exchange Type有四种 RabbitMQ常用的Exchange Type有三种:fanout、direct、topic。headers不常用。 fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。将消息发送与该exchange绑定的所有的对列,不需要比较路由键 direct:把消息投递到那些binding key与routing key完全匹配的队列中。要求路由键与对列名完全匹配 topic:将消息路由到binding key与routing key模式匹配的队列中。用#匹配0或者多个,*匹配一个 4 下面简单实现下图的结果 1 创建direct类型的交换器 2 创建

Rocket MQ简介

ⅰ亾dé卋堺 提交于 2019-11-28 10:51:33
一、概念 1. 中间件:位于系统之间的服务 2. 消息中间件:消息队列MQ,用于接收消息、存储消息、转发消息的中间件 3. Rocket MQ: 分布式的消息中间件,生产者、消费者、队列都可以分布式 二、RocketMQ使用 1. 在服务器上安装Rocket MQ 2. 启动rocket mq,即name server 3. 启动broker, 设置对应的name server 4. 消费者代码 public class Consumer { public static void main(String[] args) throws InterruptedException, MQClientException { //声明并初始化一个consumer //需要一个consumer group名字作为构造方法的参数,这里为consumer1 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer1"); //同样也要设置NameServer地址 consumer.setNamesrvAddr("10.1.54.121:9876;10.1.54.122:9876"); //这里设置的是一个consumer的消费策略 //CONSUME_FROM_LAST_OFFSET 默认策略,从该队列最尾开始消费