Kafka

那些年,面试官问你的消息队列

∥☆過路亽.° 提交于 2021-01-05 08:23:25
MQ理论介绍 一、为什么需要消息队列(MQ) 主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。大量的请求到达访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection错误,引发雪崩效应。我们使用消息队列,通过异步处理请求,从而缓解系统的压力。核心:异步处理、流量削峰、应用解耦 二、应用场景 异步处理,流量削峰,应用解耦,消息通讯四个场景 2.1、异步处理 场景1:用户注册后,需要发送注册邮件和注册短信。 串行方式:将注册信息写入 数据库 成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端 并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间 假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。 因为CPU在单位时间内处理的请求数是一定的,假设CPU在1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。 并行方式处理的请求量是10次(1000/100) 小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题? 引入消息队列,将不是必须的业务逻辑,异步处理

一文搞懂注册中心 zookeeper 和 eureka 中的CP和 AP

家住魔仙堡 提交于 2021-01-04 14:10:58
前言 在分布式架构中往往伴随CAP的理论。因为分布式的架构,不再使用传统的单机架构,多机为了提供可靠服务所以需要冗余数据因而会存在分区容忍性P。 冗余数据的同时会在复制数据的同时伴随着可用性A 和强一致性C的问题。是选择停止可用性达到强一致性还是保留可用性选择最终一致性。通常选择后者。 其中 zookeeper 和 eureka分别是注册中心CP AP 的两种的实践。他们都提供服务注册中心的功能。建议使用AP。不强求数据的强一致性,达成数据的最终一致性。 ★ 服务注册中心的数据也就是返回的可用服务节点(ip+端口号) 服务A开了0-9十个服务节点,服务B需要调用服务A,两次查询返回0-8,1-9 不一致的数据。产生的影响就是0 和9 节点的负载不均衡 ” ★ 只要注册中心在 SLA 承诺的时间内(例如 1s 内)将数据收敛到一致状态(即满足最终一致),流量将很快趋于统计学意义上的一致,所以注册中心以最终一致的模型设计在生产实践中完全可以接受。 ” 1 eureka AP eureka 保证了可用性,实现最终一致性。 Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性)

kafka的分区和主题

只谈情不闲聊 提交于 2021-01-04 07:34:04
分区 设置分区数 我们无法通过Producer相关的API设定分区数和复制因子的,因为Producer相关API创建topic的是通过读取 server.properties 文件中的 num.partitions 和 default.replication.factor 的。 kafka分区分配策略 当以下事件发生时,Kafka 将会进行一次分区分配: 同一个 Consumer Group 内新增消费者 消费者离开当前所属的Consumer Group,包括shuts down 或 crashes 订阅的主题新增分区 每个分区只能由同一个消费组内的一个consumer来消费。那么问题来了,同一个 Consumer Group 里面的 Consumer 是如何知道该消费哪些分区里面的数据呢? 在 Kafka 内部存在两种默认的分区分配策略:Range 和 RoundRobin。具体策略可通过参数配置: partition.assignment.strategy 。 Range策略 range分区的对象是topic,会对同一个topic里面的partition进行排序,然后除以consumer数量,得到的步长就是每个consumer消费的数量,对consumer也进行了排序,每个consumer消费对应步长里面的partition。如果不能均分,则那么前几个消费者线程将多消费一个分区

零基础如何快速成为 Python 高手?

大憨熊 提交于 2021-01-02 11:39:23
如今学 Python 的程序员越来越多,甚至不少人会把 Python 当作第一语言 来学习。 不过尽管 Python 功能强大上手轻松,但并不代表它的学习曲线不陡峭,得来全不费工夫。 当推开 Python 的大门,你会发现 Python 入门简单但精通很难。看似语法记得滚瓜烂熟,但一进入实际项目,就被打回了原型。 比如这些问题你能第一时间想到答案吗: Python 中的协程和线程有什么区别? 生成器如何进化成协程? 并发编程中的 future 和 asyncio 有什么关系? 如何写出线程安全的高性能代码呢? 可能大部分初学者都会卡在这里。若真能解决这些问题,你就具备了成为合格 Python 工程师的必要条件。 为了系统地帮大家提升 Python 实战编程能力,迅速从初学者进阶为优秀的 Python 工程师,我联合前百度工程师开设了 《Python 核心技术与实战》 教程 。 我们不会去纠结某些生僻的知识点,而是 从实际出发,以工作中遇到的实例为主线,去讲解 Python 的核心技术和应用。 带你从基础语法起步,掌握语言的高级用法,再到项目中进行实战开发 ,让你把学到知识点通过项目都串联起来,融会贯通,形成自己的 Python 学习框架图 。 会带你从入门到进阶掌握下面 Python 核心知识点。 1.Python 基础入门 必学知识:【Python 基础数据结构】【Python

Kafka日志处理器 Python3版本实现

那年仲夏 提交于 2021-01-01 22:16:53
Kafka 日志处理器 import json import logging from kafka import KafkaProducer class KafkaHandler(logging.Handler): def __init__(self, host_list, topic='corp_it_testing', tls=None): """ :param host_list: kafka 主机集群地址(ip:port) :param topic: kafka 主题设置 :param tls: """ logging.Handler.__init__(self) self.producer = KafkaProducer(bootstrap_servers=host_list, value_serialers=lambda v: json.dumps(v).encode('utf-8'), linger_ms=10) self.topic = topic def emit(self, record): # 屏蔽 kafka自身日志 if 'kafka' in record.name: return try: msg = self.format(record) self.producer.send(self.topic, {'message': msg}) self

分布式系统架构,回顾2020年常见面试知识点梳理(每次面试都会问到其中某一块知识点)

ぐ巨炮叔叔 提交于 2020-12-31 01:17:23
分布式分为分布式缓存( Redis )、分布式锁(Redis 或 Zookeeper)、分布式服务(Dubbo 或 SpringCloud)、分布式服务协调(Zookeeper)、分布式消息队列(Kafka 、RabbitMq)、分布式 Session 、分布式事务、分布式搜索(Elasticsearch)等。不可能所有分布式内容都熟悉,一定要在某个领域有所专长。 分布式理论 问: 分布式 有哪些理论? CAP 、BASE。分布式 CAP 理论,任何一个分布式系统都无法同时满足 Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性) 这三个基本需求。最多只能满足其中两项。而 Partition tolerance(分区容错性) 是必须的,因此一般是 CP ,或者 AP。 问:你怎么理解分布式一致性? 数据一致性通常指关联数据之间的逻辑关系是否正确和完整。在分布式系统中,数据一致性往往指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。 一致性还分为强一致性,弱一致性,还有最终一致性。强一致性就是马上就保持一致。 最终一致性是指经过一段时间后,可以保持一致。 分布式事务 问:你怎么理解分布式事务?分布式事务的协议有哪些? 分布式事务是指会涉及到操作多个数据库的事务。目的是为了保证分布式系统中的数据一致性

kafka学习笔记

妖精的绣舞 提交于 2020-12-29 22:27:55
kafka : 消费者可以根据自己的需要根据offset去消费,也可以消费已经消费过的消息,前提是在消息失效的时间范围之内。 在Kafka中保证高可靠模型的依靠的是副本机制,有了副本机制之后,就算机器宕机也不会发生数据丢失。 kafka一个topic下面的所有消息都是以partition的方式分布式的存储在多个节点上。同时在kafka的机器上 partition中的每条Message包含了以下三个属性: offset MessageSize data 其中offset为long型,MessageSize为int32,表示data有多大,data为message的具体内容。它的格式和Kafka通讯协议中介绍的MessageSet格式是一致。 每个Partition其实都会对应一个日志目录,在目录下面会对应多个日志分段(LogSegment)。 LogSegment文件由两部分组成,分别为“.index”文件和“.log”文件,分别表示为segment索引文件和数据文件。这两个文件的命令规则为:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值,数值大小为64位,20位数字字符长度,没有数字用0填充顺序读操作时速度很快。 但是kafka有个问题, 如果分区过多,那么日志分段也会很多

Spark Streaming

痞子三分冷 提交于 2020-12-29 02:33:38
Spark Streaming 一、 介绍 Spark Streaming 是 Spark 核心 API 的一个扩展, 可以 实现高 吞吐 量的、 具备 容错机制的实时 流数据的 处理。 支持 从 多种 数据源获取数据, 包括kafka 、 flume 、 twitter 等。 Spark 的各个 子 框架核心都是 Spark Core 。 Spark Streaming 内部处理机制是:接受实时流的数据, 并 根据一定的时间间隔拆分成一批批的数据,然后通过 Spark Engine 处理这批数据, 最终 得到处理后的一批批结果数据。对应的批数据, 在Spark 内核对应一个 RDD 实例, 因此 , 对应 流数据的 DStream 可以看成是一组 RDDs, 即 RDD 的一个序列。 Spark Streaming 的基本原理是将输入数据流以时间片(秒级)为单位进行拆分,然后以类似批处理的方式处理每个时间片数据,基本原理图如下: 首先, Spark Streaming 把实时输入数据流以时间片Δ t (如 1 秒)为单位切分成块。 Spark Streaming 会把每块数据作为一个 RDD ,并使用 RDD 操作处理每一小块数据。每个块都会生成一个 Spark Job 处理,最终结果也返回多块。 二、 容错 DStream 基于 RDD 组成, RDD 的容错性依旧有效

应用上云新模式,Aliware 全家桶亮相杭州云栖大会

怎甘沉沦 提交于 2020-12-29 00:41:12
全面上云带来的变化,不仅是上云企业数量上的攀升,也是企业对云的使用方式的转变,越来越多的企业用户不仅将云作为一种弹性资源,更是开始在云上部署架构和应用,借助 Serverless 等技术,开发人员只需聚焦于业务代码,省去了对底层资源的维护,同时底层资源用起来会更节省。 9 月 26 日,在杭州云栖大会 - 企业数字化转型专场的现场,阿里云的架构师、产品经理和客户、合作伙伴全面分享了企业上云的新模式,并发布了简单、丰富、开放和低成本的 PaaS 产品服务集 – Aliware 全家桶。 更高效、更节省的应用托管平台 Web 应用托管上云的利器 阿里云Web应用托管服务(Web+)是一款用来运行并管理 Web 类、移动类和 API 类应用程序的 PaaS 产品。支持 Java、Python、Node.js、PHP、Ruby 和 Go 等多种语言编写并构建应用程序。客户在无需管理底层基础设施的情况下,便可简单、高效、安全而又灵活的对应用进行部署、伸缩、调整和监控。例如,深圳奥哲网络科技有限公司基于 Web 应用托管服务的自动生成环境,无须每次都要手动部署并交付系统给客户。 云上 Serverless 神器 Serverless 应用引擎(简称 SAE )是阿里云首个基于将 Serverless 架构和微服务架构完美融合的 PaaS 类产品,解决了用户的效率和成本问题

2020技能大赛改革赛云计算赛项 先电2.4 paas 容器部分记录

六眼飞鱼酱① 提交于 2020-12-28 01:20:05
1.部分 (1) 任务1 Docker CE及私有仓库安装任务(5分) 1.在master、node1、node2、cicd-node各节点中分别安装DockerCE和docker-compose。(1分) 懒得写 2.在cicd-node节点安装Registry私有仓库,导入/opt/containerk8s/docker/images目录下所有镜像,并推送到Registry私有仓库。 懒得写 3.在node1节点上从仓库中拉取mysql:latest和wordpress:latest镜像,创建/root/wproject/docker-compse.yaml文件,编排部署wordpress,并设置 restart策略。 version: '2' services: mysql: image: mysql:5.6 expose: - "3306" restart: always environment: - MYSQL_ROOT_PASSWORD=123456 wordpress: image: wordpress:latest ports: - "82:80" restart: always environment: - WORDPRESS_DB_HOST=mysql - WORDPRESS_DB_USER=root - WORDPRESS_DB_PASSWORD=123456