转自:http://blog.csdn.net/bailove/article/details/44240303

业务场景

来疯直播互动平台,每天有数百万人上下线,有数十万人同时参与互动直播聊天。用户的登陆、退出及用户间的各种交互行为如聊天、送礼、关注、投票、抢沙发等等事件都会产生大量的消息。这些消息具有瞬间爆发性,比如热门直播间刚开播,直播表演的高潮等等。而用户的礼物、星星、喇叭、沙发等这类消息是不允许丢失,必须100%送达。这就需要有一个高性能,高可靠,稳定可拓展的消息服务平台的支撑。它要求在网络压力大及服务器宕机等灾害的情况下,保证消息至少被发送到服务器一次。我们需要对大数据平台已提供的消息服务kafka进行测试。

测试环境

cpu:24 Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz

内存:32G

磁盘数量:1 (普通sata盘)

kafka版本:0.8.2

集群规模:4节点

Topic副本数:3

Topic分片数(partition):4

灾难模拟

 

  1. 消息发送过程中宕掉其中一个节点,或同时宕掉两个节点(最多同时宕2台,因为副本数为3)

  2. 频繁宕机重启其中某个节点

  3. 交替宕机重启某一个或两个broker但是保证不能同时有3个节点宕机

(PS:同时出现三个节点宕机的情况,在近1年多运营中我们还没有遇到过,最多出现两个点宕机。)

 

测试结果

结论

同步_ack模式能够保证消息至少被发送一次到服务器。在三备份情况下,kafka集群不同时宕机两台以上时,能够正常给生产端和消费端提供服务。但是采用这种模式可能由于网络或服务问题导致重复发送数据,所以消费端的消费操作需要是幂等的。

同步_ack非batch

同步_ack 在不做batch的情况下单进程的发送效率比较低发送速率大概 500kb/s,增加进程数量可以提高总的发送效率。

采用这种模式,数据丢失或表现为丢失情况:

①:kafka服务器同时宕机三台以上时(副本数为3),由于没有leader服务导致producer产生的数据没有写入kafka,数据丢失。

②:消费端程序宕机,可能造成业务方面的统计错误,表现为数据丢失。此时数据没有真正丢失而是消费端消费掉的部分消息没有执行完业务逻辑表现的出来的数据丢失。消费端出现这种情况,需要有数据回滚,重新消费,补数据的机制。

同步_ack_batch

同步_ack_ batch(200条)的情况下基本达到异步_noack不做batch模式的发送速率。单客户端7m/s(如果增大batch量这个速率还会增加),多客户端基本呈线性增加,瓶颈受限于网络带宽。

采用这种模式,数据丢失或表现为丢失情况:

①:同上

②:同上

③:因是batch发送,producer会缓存了一部分数据,如果producer宕机会造成batch在内存中且还没发送出去的消息丢失。对于这种情况producer端需要做消息持久化,定时做offset的checkpoint,将已经持久化的消息发送到kafka,如果producer意外宕机,那么从checkpoint开始恢复数据重新发送。

参考方案

针对来疯的业务场景,我们大概可以将消息分为以下三种:

1.数据量大,且允许少量数据丢失。例如用户进入频道、聊天、上下线等采用异步_noack模式

2.数据量不大,数据不允许丢失。例如用户金喇叭、抢沙发、守护等采用同步_ack模式

3.数据量大,数据不允许丢失。例如用户使用星星、送礼物、投票等Producer采用同步_ack_batch模式

针对不同类消息的应用场景定制不同的发送策略,来保证消息能够可靠高效的发送到kafka服务端。

当然要保证业务可靠,除了kafka服务端的消息可靠性及性能保障外,客户端(生产端和消费端)还要做到数据持久化,数据校验及恢复,幂等操作及事务等。

此外运维也是必不可少的一环,监控客户端及服务端的各项状态,对异常情况快速报警,及时处理以保证kafka集群稳定。后续我们将继续推出kafka、storm运营相关的文章,尽情期待!

------作者简历-----------

杨万民,毕业于北京邮电大学,目前就职于优酷土豆大数据基础平台,负责集团实时计算平台的优化与运营。个人专注于storm、kafka底层技术研究。

Kafka消息的可靠性测试--针对直播业务的方案选择的更多相关文章

  1. kafka消息的可靠性

    本文来自网易云社区 作者:田宏增 Kafka的高可靠性的保障来源于其健壮的副本(replication)策略.通过调节其副本相关参数,可以使得Kafka在性能和可靠性之间运转的游刃有余.Kafka从0 ...

  2. Kafka消息delivery可靠性保证(Message Delivery Semantics)

    原文见:http://kafka.apache.org/documentation.html#semantics kafka在生产者和消费者之间的传输是如何保证的,我们可以知道有这么几种可能提供的de ...

  3. 如何保证kafka消息不丢失

    背景 这里的kafka值得是broker,broker消息丢失的边界需要对齐一下: 1 已经提交的消息 2 有限度的持久化 如果消息没提交成功,并不是broke丢失了消息: 有限度的持久化(broke ...

  4. 实际业务处理 Kafka 消息丢失、重复消费和顺序消费的问题

    关于 Kafka 消息丢失.重复消费和顺序消费的问题 消息丢失,消息重复消费,消息顺序消费等问题是我们使用 MQ 时不得不考虑的一个问题,下面我结合实际的业务来和你分享一下解决方案. 消息丢失问题 比 ...

  5. Kafka消息系统基础知识索引

    一些观念的修正 从 0.9 版本开始,Kafka 的标语已经从“一个高吞吐量,分布式的消息系统”改为"一个分布式流平台". Kafka不仅仅是一个队列,而且是一个存储,有超强的堆积 ...

  6. 一文看懂Kafka消息格式的演变

    摘要 对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化.随着Kafka的迅猛发展,其消息格式也在不断的升级改进,从0.8.x版本开始到现在的1.1.x版本,Kaf ...

  7. 转载来自朱小厮博客的 一文看懂Kafka消息格式的演变

    转载来自朱小厮博客的 一文看懂Kafka消息格式的演变     ✎摘要 对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化.随着Kafka的迅猛发展,其消息格式也在 ...

  8. 爱奇艺直播 - 春晚直播业务API架构

    小结: 1.服务熔断策略 在网关服务中经常会对后端不同api接口做服务聚合,比如A服务 -> B服务 -> C服务 ,如果C服务出现问题,那么在调用C服务之前需要做熔断.而在设计熔断器的时 ...

  9. 【转】解决Maxwell发送Kafka消息数据倾斜问题

    最近用Maxwell解析MySQL的Binlog,发送到Kafka进行处理,测试的时候发现一个问题,就是Kafka的Offset严重倾斜,三个partition,其中一个的offset已经快200万了 ...

随机推荐

  1. SQL Server 2008 添加登录账户 配置权限

    首先打开数据库,并以windows身份验证模式扥牢固数据库, 然后在左侧的[对象资源管理器中]展开[安全性]节点,鼠标右键点击节点中的[登录名],在弹出的菜单中单击[新建登录名],弹出如图对话框: 然 ...

  2. 【Unity】8.2 GUI Style和GUISkin

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.自定义GUI Control 功能控件 (Functional Control) 是游戏必要的,而这些控件的外观对游戏的美感非 ...

  3. iptables防火墙与日志系统配合使用 监控服务器特点端口的防问源IP

    /etc/sysconfig/iptables -A INPUT -p tcp --dport 80 -j LOG --log-level 5 --log-prefix "PORT_80:& ...

  4. git for windows 无法提交修改的处理

    在git for windows里面不能commit修改,提示open shell open shell以后,使用git add [filename],会报错: fatal: Unable to cr ...

  5. MonoBehaviour类Invoke, Coroutine

    异步函数 在一个方法执行时调用另一个方法.而被调用的方法或者其中的某些语句不是立刻执行,而是过一段时间后才执行. MonoBehaviour提供了两种异步方法 调用(Invoke) 协程(Corout ...

  6. LeetCode: Convert Sorted Array to Binary Search Tree 解题报告

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  7. WPF 异步执行

    private void Operate_OnClick(object sender, RoutedEventArgs e) { AsyncFindBox(); RadWindow.Alert(&qu ...

  8. Eclipse C++的配置问题launch failed binary not found

    首先下载eclipse c++ 我的是64bit版本 安装好MinGW,并配置好环境变量,参考我的博客 http://www.cnblogs.com/fickleness/p/3273044.html ...

  9. Json转list,二层解析转换

    一层结构的数据: { "code": "0", "results": { "boyTotal": 0, "cl ...

  10. 【Web安全】越权操作——横向越权与纵向越权

    参考:http://blog.csdn.net/github_39104978/article/details/78265433 看了上面的文章,对越权操作的概念还是比较模糊,不明确实际场景. 横向越 ...