kafka与rabbit 介绍,区别,优缺点以及Java配置示例

Apache Kafka 和 RabbitMQ 是两种广泛使用的消息中间件,它们都可以实现高效的消息传递,但它们有着不同的设计理念、使用场景和特性。

Apache Kafka:
Apache Kafka 是一个分布式、高吞吐量的发布订阅消息系统,主要应用于大数据实时处理领域。

优点:

  1. 高吞吐:由于 Kafka 采用批量、异步方式进行消息推送,使得它特别适用于大数据处理。
  2. 分布式:Kafka 具备分布式处理能力,也就是说它可以将数据存储分散到多个节点上,从而提供高可用性和容错性。
  3. 持久性:Kafka 能够将数据持久化存储到硬盘,有效防止数据丢失。

缺点:

  1. 配置、管理困难:Kafka 由于其复杂的分布式特性,使得它的配置和管理相对困难。
  2. 消息处理延迟:Kafka 的吞吐量虽高,但其对消息的处理可能存在一定的延迟。

RabbitMQ:
RabbitMQ 是一个通过 AMQP 协议提供支持的消息队列服务器,主要应用于消息的路由和存储。

优点:

  1. 灵活的路由:RabbitMQ 提供了多种消息路由模式,包括直接、主题、头和扇出等,使得消息的发送更为灵活。
  2. 高效的消息推送:RabbitMQ 能够在大量消费者中进行有效的消息分发,实现高效的消息消费。

缺点:

  1. 吞吐量较低:相比于 Kafka,RabbitMQ 的吞吐量相对较低。
  2. 分布式支持较弱:虽然 RabbitMQ 也支持集群,但其分布式处理能力相较于 Kafka 较弱。

Kafka 和 RabbitMQ 的主要区别:

  1. Kafka 更适合大数据处理,提供了高吞吐、分布式、持久化等特性。
  2. RabbitMQ 在消息路由方面更具优势,提供了灵活丰富的路由模式,并且对小规模的高效消息推送有很好的支持。
  3. 在易用性方面,RabbitMQ 比 Kafka 更易配置和使用。

以下是使用 Java 对 Apache Kafka 和 RabbitMQ 的简单配置和使用示例:

Apache Kafka 的配置和使用

步骤一:Kafka producer 的设置
首先,我们需要添加 Kafka 依赖到 Maven pom.xml 文件中:

<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.5.0</version>
</dependency>

然后,创建 Kafka producer:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092"); // Kafka broker的地址
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // key的序列化方式
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // value的序列化方式Producer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("Topic", "Key", "Value");
producer.send(record); // 发送记录
producer.close(); // 关闭producer

步骤二:Kafka consumer 的设置
同样首先添加上述依赖,然后设置 Kafka consumer:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092"); // Kafka broker的地址
props.put("group.id", "test"); // consumer group的id
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // key的反序列化方式
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // value的反序列化方式KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("Topic")); // 订阅topicwhile (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1)); // 拉取数据for (ConsumerRecord<String, String> record : records) {System.out.println(record.value()); // 打印记录}
}

RabbitMQ 的配置和使用

步骤一:RabbitMQ producer 的设置
首先,我们需要添加 RabbitMQ 依赖到 Maven pom.xml 文件中:

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version>
</dependency>

然后,创建 RabbitMQ producer:

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // RabbitMQ server的地址
Connection connection = factory.newConnection(); // 新建连接
Channel channel = connection.createChannel(); // 创建信道channel.queueDeclare("queueName", false, false, false, null); // 声明队列
String message = "Hello World!";
channel.basicPublish("", "queueName", null, message.getBytes()); // 发送消息channel.close(); // 关闭channel
connection.close(); // 关闭连接

步骤二:RabbitMQ consumer 的设置
同样首先添加上述依赖,然后设置 RabbitMQ consumer:

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost"); // RabbitMQ server的地址
Connection connection = factory.newConnection(); // 新建连接
Channel channel = connection.createChannel(); // 创建信道channel.queueDeclare("queueName", false, false, false, null); // 声明队列Consumer consumer = new DefaultConsumer() {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8"); // 获取消息System.out.println(" [x] Received '" + message + "'");}
};channel.basicConsume("queueName", true, consumer); // 开始接收消息

注意,由于上述示例简化了错误处理和资源管理,在实际使用中,要确保正确处理可能的错误并正确管理连接和信道资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍如何利用 A star(A*)算法解决8数码问题

文章目录 1. A star(A*)算法简介2. 利用A*解决8数码问题(含Python代码)2.1 什么是8数码问题2.2 A*算法中的开放列表和关闭列表2.3 A*算法解决8数码问题过程2.3.1 计算节点(棋盘顺序)间距离2.3.2 交换数字生成新的节点2.3.3 A*主求解程序1. A star(A*)算法简介 A ∗ A^*…

算法之模拟

前言 模拟算法通俗地来解释就是 "照葫芦画瓢", 通常这类题的题目中就说明了这道题应该怎么做, 要做的就是把题目的意思转化为代码, 这类题的特点是思路比较简单, 考查的是代码能力. 1. 模拟算法流程, 最好在演草纸上过一遍流程, 凭空想象可能会忽略一些细节 2. 把流…

Vue3:组件间通信-$refs和$parent的使用

一、情景说明 我们在之前&#xff0c;学习了Vue3&#xff1a;标签的ref属性用法 我们知道&#xff0c;父组件中&#xff0c;给子组件使用ref标记后&#xff0c;获取到的是&#xff0c;子组件实例。 那么&#xff0c;我们就可以修改子组件实例暴露的变量值。 与之对应的是&…

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

比较靠谱的测试进度报告

在测试的过程中&#xff0c;不要等领导过问&#xff0c;有一份比较靠谱的测试进度报告&#xff0c;让关心和支持项目的干系人心里有谱&#xff0c;有利于管理层对项目的监控和资源的支持&#xff0c;有利于项目团队成员之间沟通协调&#xff0c;及时发现问题利于项目风险控制等…

八字合盘 api数据接口

八字合盘可以双方的生辰八字来以本命卦&#xff0c;年支同气&#xff0c;月令合&#xff0c;日干合&#xff0c;天干五合&#xff0c;合盘论吉凶&#xff0c;并给出相应分数&#xff0c;测算结果仅供参考。 接口名称&#xff1a;八字-八字合盘 接口平台&#xff1a;缘份居国学…

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

【漏洞复现】某科技X2Modbus网关多个漏洞

漏洞描述 最近某科技X2Modbus网关出了一个GetUser的信息泄露的漏洞,但是经过审计发现该系统80%以上的接口均是未授权的,没有添加相应的鉴权机制,以下列举多个未授权接口以及获取相关敏感信息的接口。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律…

【C++11】异常机制

文章目录 一. 什么是异常&#xff1f;二. 为什么要引入抛异常机制&#xff1f;方法一&#xff1a;直接终止程序方法二&#xff1a;返回错误码方法三&#xff1a;C 标准库中的 setjmp 和 longjmp 组合总结 C 中处理异常的方式 三. 如何进行抛异常&#xff1f;1. 关于抛出的异常对…

前端性能监控、异常监控的一些记录

文章目录 常见异常类型常用的一些异常监控的方法window.errorwindow.addEventListener(error)window.addEventListener(load)window.addEventListener(DOMContentLoaded)window.performancenavigator.sendBeacon1*1像素gifaxios 请求/响应拦截器Vue的errorHandlerReact的ErrorB…

C#网站系统如何监控登录过期

原理 网站系统监控登录过期通常涉及多个层面的技术和策略。以下是一些建议的方法来实现这一功能&#xff1a; 会话管理 会话超时设置 为每个用户会话设置一个超时时间。一旦用户在这个时间段内没有与系统进行任何交互&#xff0c;会话将被视为过期&#xff0c;用户需要重新…

[QOpenGLWidget+QMouseEvent]实时绘制长方形

复现moho-打卡第1天 - 20240402 1.1--QOpenGLWidget中显示长方形 实现方法&#xff1a;顶点着色器中给定长方形的四个顶点数据&#xff0c;代码如下&#xff1a; // 顶点位置 GLfloat vertics[1][4][3] { {{mousePressPosX,mousePressPosY,0.0},{mousePressPosX,mouseMoveP…

网络爬虫:爬取假数据

网络爬虫&#xff1a;爬取假数据 文章目录 网络爬虫&#xff1a;爬取假数据前言一、项目介绍&#xff1a;二、项目来源&#xff1a;三、架构图&#xff1a;&#xff08;流程图&#xff09;四、使用了什么技术&#xff1a;&#xff08;知识点&#xff09;五、结果示意图&#xf…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…

Linux实验过程

答案截图获取&#xff0c;代写&#xff1a; https://laowangall.oss-cn-beijing.aliyuncs.com/studentall.pdf 基本任务&#xff1a; 1.Linux操作系统安装 2.vi文本编辑 3. Linux用户及文件管理命令 4. Linux权限管理命令 5. Linux网络服务 提高任务&#xff1a; 1、Li…

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是&#xff0c;用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的&#xff1f; 其实很简单&#xff0c;只要键盘发送下面的两个报文给主机&#xff0c;字母A就能在主机上显示出来。 (1)…

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录 1.最小生成树 1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法 4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径…

Flask Python:模糊查询filter和filter_by,数据库多条件查询

数据库&#xff08;sqlalchemy&#xff09;多条件查询 前言一、filter、filter_by实现过滤查询1、filter_by()基础查询并且查询&#xff08;多条件查询&#xff09; 2、filter()like&#xff1a;模糊查询and&#xff1a;并且查询or&#xff1a;或者查询 二、all(),first(),get(…

【一站式学会Kotlin】第一节 kotlin 介绍

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我开发Android、微信小程序、鸿蒙项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默。给大家…

嵌入式系统基础知识(二):什么是实时系统?

实时系统越来越广泛地应用于各个领域&#xff0c;也越来越受到人们的重视。那什么是实时系统呢&#xff1f; 一.定义 实时系统&#xff0c;英文全称为Real-time Operating System&#xff0c;简称RTOS&#xff0c;它的正确性不仅依赖于系统计算的逻辑结果&#xff0c;还依赖于…