topic

mqtt协议-broker之moqutte源码研究三之SUBSCRIBE报文处理

感情迁移 提交于 2020-03-07 02:10:03
这一篇开始讲解moqutte对SUBSCRIBE报文的处理 代码不复杂 public void processSubscribe(Channel channel, MqttSubscribeMessage msg) { String clientID = NettyUtils.clientID(channel);//从channel里面获取clientId,具体原理看下文 int messageID = messageId(msg); LOG.info("Processing SUBSCRIBE message. CId={}, messageId={}", clientID, messageID); RunningSubscription executionKey = new RunningSubscription(clientID, messageID); SubscriptionState currentStatus = subscriptionInCourse.putIfAbsent(executionKey, SubscriptionState.VERIFIED); if (currentStatus != null) { LOG.warn("Client sent another SUBSCRIBE message while this one was being

mqtt协议-broker之moqutte源码研究四之PUBLISH报文处理

与世无争的帅哥 提交于 2020-03-07 02:03:39
先简单说明一下,对于mqtt是个双向通信的过程,也就是说,他既允许client向broker发布消息,同时也允许broker向client发布消息 public void processPublish(Channel channel, MqttPublishMessage msg) { final MqttQoS qos = msg.fixedHeader().qosLevel(); final String clientId = NettyUtils.clientID(channel); LOG.info("Processing PUBLISH message. CId={}, topic={}, messageId={}, qos={}", clientId, msg.variableHeader().topicName(), msg.variableHeader().packetId(), qos); switch (qos) { case AT_MOST_ONCE: this.qos0PublishHandler.receivedPublishQos0(channel, msg); break; case AT_LEAST_ONCE: this.qos1PublishHandler.receivedPublishQos1(channel, msg); break; case

kafka 消费重试 实现

有些话、适合烂在心里 提交于 2020-03-06 20:49:29
第一个文章 https://www.jdon.com/49366 在分布式系统中,重试是不可避免的,我们经常使用后台跑定时进行数据同步,同步不成功就实现重试,重试次数多少取决于你追求一致性还是可用性,如果希望两个系统之前无论如何都必须一致,那么你设置重试次数为无限,当然这是理想情况,实际情况是有重试次数限制和重试时间限制,如果超过不成功怎么办?丢弃会造成数据丢失进而永久不一致,人工介入又非常复杂,通过引入死信队列可以优雅处理这种问题。本文是优步Uber工程师夏宁(Ning Xia)发布的一篇如何使用Kafka的死信队列实现重试处理的。 从网络错误到复制问题甚至下游依赖关系等场景中随时可能发生的中断,大规模运行的服务必须尽可能地优雅发现、识别并处理故障。 考虑到优步Uber的运维范围和效率,我们的系统发生故障时必须智能化地具有容错性和不妥协性。为了实现这一目标,我们决定使用开源分布式消息传递平台Apache Kafka,该平台已经过业界测试,并能提供大规模的高性能。 利用这些属性,优步行车保险工程团队通过扩展卡夫卡,在我们现有的事件驱动架构中使用无阻塞请求重新处理和死信队列(DLQ),实现错误处理的解耦,在不中断实时流量情况下实现可观察的错误处理。这一策略有助于我们遍布200多个城市的驾驶员能够可靠地实现每次行程的保费扣除。 在本文中

kafka概念扫盲

左心房为你撑大大i 提交于 2020-03-05 23:42:47
一、kafka概述 1.1、定义 Kakfa是一个分布式的基于发布/订阅模式的消息队列(message queue),主要应用于大数据的实时处理领域 1.2、消息队列 1.2.1、传统的消息队列&新式的消息队列的模式 上面是传统的消息队列,比如一个用户要注册信息,当用户信息写入数据库后,后面还有一些其他流程,比如发送短信,则需要等这些流程处理完成后,在返回给用户 而新式的队列是,比如一个用户注册信息,数据直接丢进数据库,就直接返回给用户成功 1.2.2、使用消息队列的好处 A、 解耦 B、 可恢复性 C、 缓冲 D、 灵活性&峰值处理能力 E、 异步通信 1.2.3、消息队列的模式 A、点对点模式 消息生产者发送消息到消息队列中,然后消息消费者从队列中取出并且消费消息,消息被消费后,队列中不在存储。所以消息消费者不可能消费到已经被消费的消息;队列支持存在多个消费者,但是对于一个消息而言,只会 有一个消费者可以消费;如果想发给多个消费者,则需要多次发送该条消息 B】发布/订阅模式(一对多,消费者消费数据之后不会清除消息) 消息生产者将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息,和点对点的方式不同,发布到topic的消息会被所有的订阅者消费;但是数据保留是期限的,默认是7天,因为他不是存储系统;kafka就是这种模式的;有两种方式,一种是是消费者去主动去消费(拉取

Kafka学习笔记1 Kafka简介

帅比萌擦擦* 提交于 2020-03-05 09:48:09
正文 回到顶部 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。 主要应用场景是:日志收集系统和消息系统。 Kafka主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。 同时支持离线数据处理和实时数据处理。 Scale out:支持在线水平扩展 1.2 消息系统介绍 一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。有两种主要的消息传递模式: 点对点传递模式、发布-订阅模式 。大部分的消息系统选用发布-订阅模式。 Kafka就是一种发布-订阅模式 。 1.3 点对点消息传递模式 在点对点消息系统中,消息持久化到一个队列中。此时

Kafka学习-简介

余生长醉 提交于 2020-03-05 09:47:58
   Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Cloudera、Apache Storm、Spark都支持与Kafka集成。 Kafka创建背景   Kafka是一个消息系统,原本开发自LinkedIn,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础。现在它已被作为多种类型的数据管道和消息系统使用。 活动流数据是几乎所有站点在对其网站使用情况做报表时都要用到的数据中最常规的部分。活动数据包括页面访问量(Page View)、被查看内容方面的信息以及搜索情况等内容。这种数据通常的处理方式是先把各种活动以日志的形式写入某种文件,然后周期性地对这些文件进行统计分析。运营数据指的是服务器的性能数据(CPU、IO使用率、请求时间、服务日志等等数据)。 kafka作为一个集群运行在一个或多个服务器上, kafka集群存储的消息是以topic为类别记录的, 每个消息(也叫记录record,我习惯叫消息)是由一个key,一个value和时间戳构成。 核心组件 Producer :发布消息到1个或多个topic(主题)。 Comsumer :来订阅一个或多个topic,并处理产生的消息。 Streams :充当一个流处理器

kafka 再平衡机制

◇◆丶佛笑我妖孽 提交于 2020-03-03 21:11:42
什么是再平衡 -- 所谓的再平衡,指的是在kafka consumer所订阅的topic发生变化时发生的一种分区重分配机制。一般有三种情况会触发再平衡: consumer group中的新增或删除某个consumer,导致其所消费的分区需要分配到组内其他的consumer上; consumer订阅的topic发生变化,比如订阅的topic采用的是正则表达式的形式,如test-*此时如果有一个新建了一个topic test-user,那么这个topic的所有分区也是会自动分配给当前的consumer的,此时就会发生再平衡; consumer所订阅的topic发生了新增分区的行为,那么新增的分区就会分配给当前的consumer,此时就会触发再平衡。 Kafka提供的再平衡策略主要有三种:Round Robin,Range和Sticky,默认使用Range。这三种分配策略的主要区别在于: Round Robin:会采用轮询的方式将当前所有的分区依次分配给所有的consumer; Range:首先会计算每个consumer可以消费的分区个数,然后按照顺序将指定个数范围的分区分配给各个consumer; Sticky:这种分区策略是最新版本中新增的一种策略,其主要实现了两个目的: -- 将现有的分区尽可能均衡的分配给各个consumer,存在此目的的原因在于Round

kafka 安装 创建主题 发送消息

牧云@^-^@ 提交于 2020-03-03 17:13:38
下载 https://mirrors.aliyun.com/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz wget https://mirrors.aliyun.com/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz 解压 tar zxvf kafka_2.12-2.3.0.tgz -C/opt 启动 cd /opt/kafka_2.12-2.3.0/bin ./zookeeper-server-start.sh -daemon ../config/zookeeper.properties ./kafka-server-start.sh ../config/server.properties 创建topic ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test 查看topic ./kafka-topics.sh --list --zookeeper localhost:2181 发送消息 /kafka-console-producer.sh --broker-list localhost:9092 --topic test 接收消息 ./kafka-console

A look inside Kafka Mirrormaker 2

若如初见. 提交于 2020-03-03 11:32:00
In our previous blog on A Case for Mirromaker 2 , we had discussed how enterprises rely on Apache Kafka as an essential component of their data pipelines and require that the data availability and durability guarantees cover for entire cluster or datacenter failures. As we had discussed in the blog, the current Apache Kafka solution with Mirrormaker 1 has known limitations in providing an enterprise managed disaster recovery solution. MM2 ( KIP-382 ) fixes the limitations of Mirrormaker 1 with the ability to dynamically change configurations, keep the topic properties in sync across clusters

关于论坛数据库的设计(分表分库等-转)

孤人 提交于 2020-03-03 08:17:08
关于论坛数据库的设计 文章分类:数据库 一个简单的论坛系统 1:包括下列信息: 2:每天论坛訪问量300万左右,更新帖子10万左右。 请给出数据库表结构设计,并结合范式简要说明设计思路。 一. 发帖主题和回复信息存放在一张表,并在这个表中添加user_name字段 对数据库的操作而言,检索数据的性能基本不会对数据造成非常大的影响(精确查找的情况下),而对表与表之间的连接却会产生巨大的影响。 特别在有巨量数据的表之间。因此对问题的定位基本能够确定:在显示和检索数据时,尽量降低数据库的连接以及表与表之间的连接; 引用 1: user:用户基本信息表 字段有:user_id,user_name,email,homepage,tel,add... 2: forum_item:主题和回复混合表 字段有:id,parent_id,user_id,user_name,title,content,.... parent_id=0或者null表示是主题,否则=n表示是id=n那条帖子的回复 UserName字段是冗余的,因此在用户改动UserName的时候就会产生同步数据的问题。这个须要程序来进行弥补 二. 主题表和主题回复分开保存 引用 1: user:用户基本信息表 字段有:user_id,user_name,email,homepage,tel,add... 2: forum_topic