JiaHe's Blog

读万卷书,行万里路

初识 Kafka

什么是 Kafka

Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。

Kafka 的基本术语

消息:Kafka 中的数据单元被称为消息,也被称为记录,可以把它看作数据库表中某一行的记录。

批次:为了提高效率, 消息会分批次写入 Kafka,批次就代指的是一组消息。

主题:消息的种类称为 主题(Topic), 可以说一个主题代表了一类消息。相当于是对消息进行分类。主题就像是数据库中的表。

分区:主题可以被分为若干个分区(partition),同一个主题中的分区可以不在一个机器上,有可能会部署在多个机器上,由此来实现 kafka 的伸缩性,单一主题中的分区有序,但是无法保证主题中所有的分区有序

生产者:向主题发布消息的客户端应用程序称为生产者(Producer),生产者用于持续不断的向某个主题发送消息。

消费者:订阅主题消息的客户端程序称为消费者(Consumer),消费者用于处理生产者产生的消息。

消费者群组:生产者与消费者的关系就如同餐厅中的厨师和顾客之间的关系一样,一个厨师对应多个顾客,也就是一个生产者对应多个消费者,消费者群组(Consumer Group)指的就是由一个或多个消费者组成的群体。

偏移量:偏移量(Consumer Offset)是一种元数据,它是一个不断递增的整数值,用来记录消费者发生重平衡时的位置,以便用来恢复数据。

broker: 一个独立的 Kafka 服务器就被称为 broker,broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。

broker集群:broker 是集群 的组成部分,broker 集群由一个或多个 broker 组成,每个集群都有一个 broker 同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来)。

副本:Kafka 中消息的备份又叫做 副本(Replica),副本的数量是可以配置的,Kafka 定义了两类副本:领导者副本(Leader Replica) 和 追随者副本(Follower Replica),前者对外提供服务,后者只是被动跟随。

重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。

阅读全文 »

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<dependency>

配置信息

属性描述
spring.rabbitmq.addresses逗号分隔的RabbitMQ代理地址列表
spring.rabbitmq.host代理的主机(默认为localhost)
spring.rabbitmq.port代理的端口(默认为5672)
spring.rabbitmq.username访问代理所使用的用户名(可选)
spring.rabbitmq.password访问代理所使用的密码(可选)
spring.rabbitmq.template.exchange设置默认的Exchange(可选)
spring.rabbitmq.template.routing-key设置默认的Routing-Key(可选)
spring.rabbitmq.template.receive-timeout设置默认超时时间(可选)
阅读全文 »

引言

面试中面试官喜欢问组件的实现原理,尤其是常用技术,我们平时使用了 SpringCloud 还需要了解它的实现原理,这样不仅起到举一反三的作用,还能帮助轻松应对各种问题及有针对的进行扩展。
以下是《Java 深入微服务原理改造房产销售平台》课程讲到的部分原理附图,现在免费开放给大家,让大家轻松应对原理面试题。

阅读全文 »

前言

SQL注入是Web安全界地位很高的一个漏洞,它把矛头对准网站最为重要的数据库,利用成本低而危害巨大。若说一个普通开发人员有那么点儿安全意识,那一定和SQL注入有关。如今随着Web安全逐渐被重视,大家安全意识提升,同时各种预编译框架、ORM层出不穷,SQL注入已不像10年前那么泛滥,那么SQL注入的前世今生是怎样的?在这个预编译时代,SQL注入为何仍未销声匿迹?而预编译的底层又有哪些细节需要安全工程师知晓?这将是本文所重点探究之处。

阅读全文 »

需求:统计表中连续超过3天都提交了任务的用户名

SELECT rn AS '连续提交任务天数', submit_creator AS '提交人' FROM
(
SELECT
@rn:= CASE
-- 当前记录的用户名等于上一条记录的用户名 AND 当前记录的日期与上一条记录的日期之差为1
WHEN @pre_submit_creator=creator AND DATEDIFF(@pre_submit_date,submit_date) = 1
THEN @rn + 1
ELSE 1 END AS rn,
@pre_submit_date:=submit_date AS submit_date,
@pre_submit_creator:=creator AS submit_creator
FROM
(
-- 日期降序并去重
SELECT DISTINCT DATE(gmt_create) AS submit_date, creator FROM task_log
ORDER BY DATE(gmt_create) DESC
) AS log,
(SELECT @rn=0, @submit_creator=null, @submit_date=null) AS b
) log
where rn >= 3;