腾讯SNG全链路日志监控平台之构建挑战
作者丨吴树生:腾讯高级工程师,负责SNG大数据监控平台建设。近十年监控系统开发经验,具有构建基于大数据平台的海量高可用分布式监控系统研发经验。导语:当前SNG全链路日志监控平台每日数据存储量10TB,可做到1/10的压缩比,峰值流量30GB/s。在构建这样一个平台时,究竟遇到了什么技术困难,以及是如何解决的,请看原文。背景全链路日志监控在现在盛行的微服务和分布式环境下,能有效地提高问题定位分析效率,成为开发和运维利器。当前已有开源解决方案和成熟的厂商提供。比如Twitter的zipkin基于Google的Dapper论文设计开发了分布式跟踪系统,用于采集各处理节点间的日志和耗时信息,帮助用户排查请求链路的异常环节。在有统一RPC中间件框架的业务部门容易接入zipkin。但腾讯SNG全链路日志监控平台(后成全链路)面对的实际业务场景更为复杂,全链路日志监控实现遇到更多的挑战,全链路技术选型经历了从开源组件到自研的变化。当前SNG全链路日志监控平台已接入空间和视频云业务日志数据。每日数据存储量10TB,可做到
CMSIS_RTOS_Tutorial自译中文版
一.序言本资料是TrevorMartin编写的《TheDesignersGuidetotheCortex-MProcessorFamily》的摘要,并得到Elsevier的再版许可。查询更多细节,请到本资料尾部进阶章节。本资料着力于介绍RTX,RTX可运行在基于Cortex-M构架的微控制器上。尤其,RTX符合CMSIS标准。CMSIS全称"CortexMicrocontrollerInterfaceStandard",定义了基于Cortex-M构架的微控制器标准的RTOSApi。CMSISRTOSApi提供基于RTOS开发的接口,掌握后可跨多系列微控制器使用。另外,CMSISRTOSApi也为高级应用(如Java虚拟机,UML)等提供标准接口。同时,CMSISRTOSApi也是不依赖于硬件层的标准接口,支持代码重复使用。作为新手,适应RTOS需要大量的练习,但RTOS的便利性会使使用者再也不想回到裸板程序。1.1.起步-安装工具要运行本资料中的示例代码,必须安装MDK-ARM工具链。可在如下地址下
Spark Streaming+Kafka
前言在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了sparkstreaming从kafka中不断拉取数据进行词频统计。本文首先对sparkstreaming嵌入kafka的方式进行归纳总结,之后简单阐述Sparkstreaming+kafka在舆情项目中的应用,最后将自己在SparkStreaming+kafka的实际优化中的一些经验进行归纳总结。(如有任何纰漏欢迎补充来踩,我会第一时间改正^v^)Sparkstreaming接收Kafka数据用sparkstreaming流式处理kafka中的数据,第一步当然是先把数据接收过来,转换为sparkstreaming中的数据结构Dstream。接收数据的方式有两种:1.利用Receiver接收数据,2.直接从kafka读取数据。基于Receiver的方式这种方式利用接收器(Receiver)来接收kafka中的数据,其最基本是使用Kafka高阶用户API
Spring Cloud Bus整合RabbitMQ
上篇文章中小伙伴们已经学会了RabbitMQ的基本安装与使用以及如何在SpringBoot中使用RabbitMQ,整体来说还是比较简单的。本文我们来看看SpringCloudBus和RabbitMQ的整合,看看如何更简单的实现配置刷新。本文是SpringCloud系列的第二十七篇文章,了解前二十六篇文章内容有助于更好的理解本文:1.使用SpringCloud搭建服务注册中心2.使用SpringCloud搭建高可用服务注册中心3.SpringCloud中服务的发现与消费4.Eureka中的核心概念5.什么是客户端负载均衡6.SpringRestTemplate中几种常见的请求方式7.RestTemplate的逆袭之路,从发送请求到负载均衡8.SpringCloud中负载均衡器概览9.SpringCloud中的负载均衡策略10.SpringCloud中的断路器Hystrix11.SpringCloud自定义Hystrix请求命令12
【Kafka源码】KafkaConsumer
[TOC]KafkaConsumer是从kafka集群消费消息的客户端。这是kafka的高级消费者,而SimpleConsumer是kafka的低级消费者。何为高级?何为低级?我们所谓的高级,就是可以自动处理kafka集群的失败信息,也可以适应kafka集群中消息的分区迁移。这个客户端也可以与服务端进行交互,使用消费者分组负载平衡消费,下面我们具体会讲解。消费者与对应的broker保持TCP连接,来获取数据。使用完成后关闭消费者连接失败,会泄露连接。这个消费者不是线程安全的。一、偏移量和消费者位置OffsetsAndConsumerpositionKafka在分区中为每条记录维护了一个数字形式的偏移量。这个偏移量是数据在分区中的唯一值,也可以表示为消费者在分区中的偏移量。例如,一个消费者的偏移量为5,表示偏移量为0到4的消息已经被消费过。关于消费者使用的偏移量,有两个比较重要的概念。1.1TopicPartition消费者的偏移量表示消费者下一个需要消费的消息的偏移量。这个值会比当前消费者在那个分区刚刚消费的消息偏移量
Celery 源码解析五: 远程控制管理
今天要聊的话题可能被大家关注得不过,但是对于Celery来说确实很有用的功能,曾经我在工作中遇到这类情况,就是我们将所有的任务都放在同一个队列里面,然后有一天突然某个同学的代码写得不对,导致大量的耗时任务被同时塞进了消息队列里面,这就悲剧了,这直接导致了其他服务长时间不可用,例如发送登录短信验证码无法使用了,还有支付信息无法同步了等等,反正就是造成了一些不小的影响。当时我们的处理方式就很被动,只能手动连接上MQ,然后把消息卸掉,其实也就手动将这些消息抛弃掉,从而让其他业务的消息可能正常运行。但是,这种方式也只适合当初作为少量流量的情况,对于搭建了大集群和大量任务的消息队列来说,这种方式是不可想象的,这么做是要死人的,不仅仅是被累垮,上头的口水都能把你淹了。所以,这个时候,我需要介绍一个Celery不太常被人使用的功能——远程控制。远程控制功能其实Celery很早之前就存在控制命令,例如可以使用Pythonshell的shell命令,可以查看任务状态的status命令等等,但是这些命令都是本地的,不能让人觉得有意
现代IM系统中消息推送和存储架构的实现
前言IM全称是『InstantMessaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。当然目前微信已经成长为一个生态型产品,但其核心功能还是IM。还有一些非以IM系统为核心的应用,最典型的如一些在线游戏、社交应用,IM也是其重要的功能模块。可以说,带有社交属性的应用,IM功能一定是必不可少的。IM系统在互联网初期即存在,其基础技术架构在这十几年的发展中更新迭代多次,从早期的CS、P2P架构,到现在后台已经演变为一个复杂的分布式系统,涉及移动端、网络、安全和存储等技术的方方面面。其支撑的规模也从早期的少量日活,到现在微信这个巨头最新公布的达到9亿的日活的体量。IM系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步和存储:消息的同步:将消息完整的、快速的从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来说,一般至少要支持在线和离线推送,高级的I
流计算框架 Flink 与 Storm 的性能对比
1.背景ApacheFlink和ApacheStorm是当前业界广泛使用的两个分布式实时计算框架。其中ApacheStorm(以下简称“Storm”)在美团点评实时计算业务中已有较为成熟的运用(可参考Storm的可靠性保证测试),有管理平台、常用API和相应的文档,大量实时作业基于Storm构建。而ApacheFlink(以下简称“Flink”)在近期倍受关注,具有高吞吐、低延迟、高可靠和精确计算等特性,对事件窗口有很好的支持,目前在美团点评实时计算业务中也已有一定应用。为深入熟悉了解Flink框架,验证其稳定性和可靠性,评估其实时处理性能,识别该体系中的缺点,找到其性能瓶颈并进行优化,给用户提供最适合的实时计算引擎,我们以实践经验丰富的Storm框架作为对照,进行了一系列实验测试Flink框架的性能,计算Flink作为确保“至少一次”和“恰好一次”语义的实时计算框架时对资源的消耗,为实时计算平台资源规划、框架选择、性能调优等决策及Flink平台的建设提出建议并提供数据支持,为后续的SL
Rabbitmq~对Vhost的配置
rabbitmq里有一些概念我们要清楚,如vhost,channel,exchange,queue等,而前段时间在部署rabbitmq环境时启用了虚拟主机vhost,感觉他主要是起到了消息隔离的作用,下面分别再说一下它们的知识。VHostvhost去做第一层的区分,虚拟主机,工作组等,它默认是/添加自己项目的Vhost添加成功后,在列表里可以显示添加建立一个用户,设置密码把用户添加到对应的VHost组里,注意连接时也要使用VHost参数,如果没有特别设置,可以不指定它,默认就是/channel创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算
源码阅读技巧篇
转载请注明原创出处,谢谢!说在前面本人水平有限,下面的一些都是本人的思考与理解,如果有那里不对,希望各位大佬积极指出,欢迎在留言区进行评论交流、探讨。主题为什么要读源码读什么样的源码有什么技巧思考、交流坚持为什么要源码说到读源码,让我想起来了读书,古语有云:“读破万卷书,下笔如有神”。多读读大师的想法技巧通过大量阅读进行积累把一些零碎的知识点整合起来就拿RocketMQ来说,它是如何实现高性能、高可用。之前写过高可用的一些思考和理解里面的特性他应该都满足,RocketMQ就是把这些很多零散的知识点整合运用之后写出的非常牛逼的项目。读什么样的源码依旧拿读书来说,我们应该读什么书呢?读名著,读大师的书。那么读源码在我看来是一样的,尽量进行选择,如果不选择有时候还会浪费时间等。只要是优秀的从那个开始无所谓。有什么技巧个人常用的有如下,欢迎留言区补充。先让项目可以跑起来(很重要的一点)debug打印日志以及修改log4j日志级别查看调用栈全文搜索大胆猜测再验证在多线程以及网络方面阅读调试应该是最难的(关于多线程我的史上
Apache Kafka 0.11.0.2 发布,Bug 修复和改进
ApacheKafka0.11.0.2已发布。这是一个错误修复版本,包含16个来自JIRA的修复和改进,其中包括一些严重的错误。具体更新内容如下:Bug[KAFKA-5140]-FlakyResetIntegrationTest[KAFKA-5967]-IneffectivecheckofnegativevalueinCompositeReadOnlyKeyValueStore#approximateNumEntries()[KAFKA-5970]-DeadlockduetolockingofDelayedProduceandgroup[KAFKA-5986]-StreamsStateRestorationnevercompleteswhenloggingisdisabled[KAFKA-6003]-ReplicationFetcherthreadforapartitionwithnodatafailst
《RabbitMQ官方文档》订阅与发布
之前的教程中,我们创建了一个工作队列。在一个工作队列背后的假设是将每个任务都准确地交付给一个工作人员。在这个环节我们要做些完全不同的事情—我们将要把一个消息传递给多个消费者。这种模式被称为“发布/订阅”。为了阐述这种模式,我们打算构建一个简单的日志系统。它由两个程序组成—第一个发出日志消息,第二个接收消息并打印出来。在我们的日志系统中,每次运行接收者程序的副本都将收到消息。这使我们能够运行一个接收者程序,将日志导向磁盘;同时我们可以运行另一个接收者程序查看屏幕上的日志。实际上,已发布的日志消息将被广播到所有接收者。交换在教程的前面部分中,我们发送和接受消息都来自一个队列,现在是时候引进一个完整的Rabbit消息模型了。让我们快速地回顾一下在之前的教程里介绍的内容:生产者是发送消息的用户程序。队列是储存消息的缓存。消费者是接收消息的用户程序。在Rabbit消息模型中核心的思想是,生产者从不直接向一个队列发送任何消息。事实上,通常生产者甚至不知道将一个消息是否传递到了某一队列。相反的,生产者只能向交换器(
学习 Apache Kafka(二):Kafka 1.0 单机环境搭建
:point_down:以Ubuntu16.04为例,搭建单机Kafka1.0环境,单机环境只适合开发使用安装Java8安装Java8:sudoadd-apt-repositoryppa:webupd8team/javasudoapt-getupdatesudoapt-getinstalloracle-java8-installer验证安装:java-version安装并配置ZooKeeper访问ZooKeeper官网,下载zookeeper-3.4.11.tar.gz并解压缩:tar-zxfzookeeper-3.4.11.tar.gz修改conf/zoo.cfg文件:tickTime=2000dataDir=/var/lib/zookeeperclientPort=2181创建数据文件目录:mkdir-p/var/lib/zookeeper启动ZooKeeper服务:bin/zkServer.shstart安装并配置Kafka
Kafka的消息可靠传递
Kafka提供的基础保障可以用来构建可靠的系统,却无法保证完全可靠.需要在可靠性和吞吐之间做取舍.Kafka在分区上提供了消息的顺序保证.生产的消息在写入到所有的同步分区上后被认为是已提交(不需要刷到硬盘).生产者可以选择在消息提交完成后接收broker的确认,是写入leader之后,或者所有的副本只要有一个副本存在,提交的消息就不会丢失消费者只能读取到已提交的消息复制Kafka的复制机制保证每个分区有多个副本,每个副本可以作为leader或者follower的角色存在.为了保证副本的同步,需要做到:保持到zk的连接会话:每隔6s向zk发送心跳,时间可配置每隔10s向leader拉取消息,时间可配置从leader拉取最近10s的写入的消息.保持不间断的从leader获取消息是不够的,必须保证几乎没有延迟Broker配置复制因子default.replication.factorbroker级别的副本数设置,通过这个配置来控制自动创建的topic的副本数.为N的时候,可以容忍失去N-1个
Kafka 源码解析之 Consumer 两种订阅模式(八.1)
在前面两篇KafkaConsumer的文章中,ConsumerPoll模型这部分基本上已经完整结束,Consumer这块的文章计划是要写五篇,这篇是Consumer这类的第三篇,主要从其中的三个小块细节内容着手,这三个地方有一个相同之处,那就是在KafkaConsumer中都提供了两个不同的解决方案,但具体怎么去使用是需要用户根据自己的业务场景去配置,这里会讲述其底层的具体实现。本篇文章讲述的这三点内容分别是:consumer的两种订阅模式,subscribe()和assign()模式,一种是topic粒度(使用group管理),一种是topic-partition粒度(用户自己去管理);consumer的两种commit实现,commitAsync()和commitSync(),即同步commit和异步commit;consumer提供的两种不同partition.assignment.strategy,这是关于一个group订阅一些topic后,group
学习 Apache Kafka(四):生产者
依赖新建一个Maven工程,修改pom.xml文件,添加依赖:
Kafka 源码解析之 Consumer 两种 commit 机制和 partition 分配机制(九)
紧接着上篇文章,这篇文章讲述Consumer提供的两种commit机制和两种partition分配机制,具体如何使用是需要用户结合具体的场景进行选择,本文讲述一下其底层实现。两种commit机制先看下两种不同的commit机制,一种是同步commit,一种是异步commit,既然其作用都是offsetcommit,应该不难猜到它们底层使用接口都是一样的,其调用流程如下图所示:同步commit//对poll()中返回的所有topics和partition列表进行commit//这个方法只能将offset提交Kafka中,Kafka将会在每次rebalance之后的第一次拉取或启动时使用同步commit//这是同步commit,它将会阻塞进程,直到commit成功或者遇到一些错误publicvoidcommitSync(){}//只对指定的topic-partition列表进行commitpublicvoidcommitSync(finalMap
Kafka系列(五)Kafka内部机制
本系列文章为对《Kafka:TheDefinitiveGuide》的学习整理,希望能够帮助到大家本章我们探讨下以下三个问题:Kafka复制机制是怎么工作的?Kafka是怎么处理生产者和消费者的请求的?Kafka是怎么存储文件或者索引的?集群成员管理Kafka使用Zookeeper管理集群成员状态,每一个broker都有一个唯一ID(在配置文件中指定或者自动生成),当broker启动时会在Zookeeper中注册相应的临时节点(可参考这篇文章)。如果集群中存在相同的ID,那么新的broker会启动失败。Zookeeper中的节点注册路径为/broker/ids,Kafka的各个组件会监听此路径下的变更信息,当broker加入或者离开时,它们会收到通知。当节点离开(可能由于停机、网络故障、长GC等导致)时,Zookeeper中相应的节点会消失,但该broker的ID仍然会在某些数据结构中存在。比如,每个主题的副本列表会包含副本所在的brokerID,因此如果一个broker离开同时有一个新的broker拥有此相同的ID,那么新的b
基于TableStore的数据采集分析系统介绍
摘要在互联网高度发达的今天,ipad、手机等智能终端设备随处可见,运行在其中的APP、网站也非常多,如何采集终端数据进行分析,提升软件的品质非常重要,例如PV/UV统计、用户行为数据统计与分析等。虽然场景简单,但是数据量大,对系统的吞吐量、实时性、分析能力、查询能力都有较高的要求,搭建起来并不容易。今天我们来介绍一下基于阿里云表格存储,以及相关的大数据产品来采集与分析数据的方案。TableStoreTableStore(表格存储)是阿里云自主研发的专业级分布式NoSQL数据库,是基于共享存储的高性能、低成本、易扩展、全托管的半结构化数据存储平台,支撑互联网和物联网数据的高效计算与分析。目前不管是阿里巴巴集团内部,还是外部公有云用户,都有成千上万的系统在使用。覆盖了重吞吐的离线应用,以及重稳定性,性能敏感的在线应用。表格存储的具体的特性可以看下面这张图片。基于TableStore的数据采集分析系统一个典型的数据采集分析统计平台,对数据的处理,主要由如下五个步骤组成:对于上图流程的具体实现,网上有许多可以参考的案例,数据在客户端采
Spring Boot与RabbitMQ结合实现延迟队列
顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。延迟队列能做什么?延迟队列多用于需要延迟工作的场景。最常见的是以下两种场景:延迟消费。比如:用户生成订单之后,需要过一段时间校验订单的支付状态,如果订单仍未支付则需要及时地关闭订单。用户注册成功之后,需要过一段时间比如一周后校验用户的使用情况,如果发现用户活跃度较低,则发送邮件或者短信来提醒用户使用。延迟重试。比如消费者从队列里消费消息时失败了,但是想要延迟一段时间后自动重试。如果不使用延迟队列,那么我们只能通过一个轮询扫描程序去完成。这种方案既不优雅,也不方便做成统一的服务便于开发人员使用。但是使用延迟队列的话,我们就可以轻而易举地完成。如何实现?别急,在下文中,我们将详细介绍如何利用SpringBoot加RabbitMQ来实现延迟队列。本文出现的示例代码都已push到Github仓库中:https://github.com/Lovelcp/blog-demos/tree/master/spring-bo