精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-16
很久没更新blog了,前几天看到淘宝开源了Meta,估计notify也要开源了。其实消息中间件的一个非常重要的核心部件就是持久化存储,可能Meta的功能定位使得它在这一块的实现相对notify和activemq就简单些。趁着有点时间,把activeMQ的kahadb存储引擎做了个分析,希望能对jms实现感兴趣的朋友有点帮助。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-18
看来大家关注底层的比较少哈,最近也在考虑自己做一个分布式queue的存储,支持动态扩容,数据顺序性,数据多写(解决数据不丢)。
lz对这方面的存储,有研究不? |
|
返回顶楼 | |
发表时间:2012-03-19
agapple 写道 看来大家关注底层的比较少哈,最近也在考虑自己做一个分布式queue的存储,支持动态扩容,数据顺序性,数据多写(解决数据不丢)。
lz对这方面的存储,有研究不? 可以考虑下淘宝的 metamorphosis,已经实现了HA复制。 |
|
返回顶楼 | |
发表时间:2012-03-19
dennis_zane 写道 agapple 写道 看来大家关注底层的比较少哈,最近也在考虑自己做一个分布式queue的存储,支持动态扩容,数据顺序性,数据多写(解决数据不丢)。
lz对这方面的存储,有研究不? 可以考虑下淘宝的 metamorphosis,已经实现了HA复制。 看了下metamorphosis,我的几个需求基本能满足,数据不丢这个基于master/slave模式不一定能100%保证吧, master disk crash了之后,总会丢一些数据。 有对应的性能测试报告不? |
|
返回顶楼 | |
发表时间:2012-03-19
最近看了下bookkeeper + hedwig的实现。不过他的两层服务架构部署已经可用性要打点折扣
|
|
返回顶楼 | |
发表时间:2012-03-19
最后修改:2012-03-19
agapple 写道 dennis_zane 写道 agapple 写道 看来大家关注底层的比较少哈,最近也在考虑自己做一个分布式queue的存储,支持动态扩容,数据顺序性,数据多写(解决数据不丢)。
lz对这方面的存储,有研究不? 可以考虑下淘宝的 metamorphosis,已经实现了HA复制。 看了下metamorphosis,我的几个需求基本能满足,数据不丢这个基于master/slave模式不一定能100%保证吧, master disk crash了之后,总会丢一些数据。 有对应的性能测试报告不? master/slave有两种模式,同步复制和异步复制,这跟mysql是机制是一样的。不过我更推荐异步复制,同步复制的性能会差一些,并且机制相对复杂。 另外,一般我们磁盘都做RAID,这样一来其实异步复制就可以接近100%的高可用。 性能测试报告内部有做,不过好像没放出来,性能很大程度上取决于磁盘和参数配置,磁盘是SATA还是SAS,参数主要是每隔多少秒force和每隔多少个消息force。总体上说,性能不是个问题。 一个印象数据,2K的消息,100个并发发送消息,每隔10秒force和每1000条消息force,TPS接近25000,磁盘是做RAID 10的SAS盘,15000转。如果是普通SATA盘,性能下降一半多。异步复制对性能没有影响。另外,在设置每条消息做force的情况下,会利用group commit技术来提高吞吐量,TPS不下降,但是CPU会上升很多。 有兴趣可以自己测试下。 |
|
返回顶楼 | |
发表时间:2012-03-20
dennis_zane 写道 agapple 写道 dennis_zane 写道 agapple 写道 看来大家关注底层的比较少哈,最近也在考虑自己做一个分布式queue的存储,支持动态扩容,数据顺序性,数据多写(解决数据不丢)。
lz对这方面的存储,有研究不? 可以考虑下淘宝的 metamorphosis,已经实现了HA复制。 看了下metamorphosis,我的几个需求基本能满足,数据不丢这个基于master/slave模式不一定能100%保证吧, master disk crash了之后,总会丢一些数据。 有对应的性能测试报告不? master/slave有两种模式,同步复制和异步复制,这跟mysql是机制是一样的。不过我更推荐异步复制,同步复制的性能会差一些,并且机制相对复杂。 另外,一般我们磁盘都做RAID,这样一来其实异步复制就可以接近100%的高可用。 性能测试报告内部有做,不过好像没放出来,性能很大程度上取决于磁盘和参数配置,磁盘是SATA还是SAS,参数主要是每隔多少秒force和每隔多少个消息force。总体上说,性能不是个问题。 一个印象数据,2K的消息,100个并发发送消息,每隔10秒force和每1000条消息force,TPS接近25000,磁盘是做RAID 10的SAS盘,15000转。如果是普通SATA盘,性能下降一半多。异步复制对性能没有影响。另外,在设置每条消息做force的情况下,会利用group commit技术来提高吞吐量,TPS不下降,但是CPU会上升很多。 有兴趣可以自己测试下。 看了下文档,存在几个疑问: 1. 引用 发送消息怎么保证有序? 只保证单线程发送的消息有序 只保证发送同一个分区的消息有序 实现自定义分区选择器 我的业务场景是:顺序推送数据到server,如果涉及到分区,那如果单个消费者在处理时,连接到多个分区后。多个分区的处理数据相比于原先的推送顺序,应该不能保持一致吧。 2. metamorphosis没看到topic的相关设计,不知道是不是我看漏了。MessageConsumer在订阅的时候没有传递订阅者id? 如果一个订阅者短暂型的crash了,对应这段时间产生的数据是否会继续给他保留? |
|
返回顶楼 | |
发表时间:2012-03-20
agapple 写道 dennis_zane 写道 agapple 写道 dennis_zane 写道 agapple 写道 看来大家关注底层的比较少哈,最近也在考虑自己做一个分布式queue的存储,支持动态扩容,数据顺序性,数据多写(解决数据不丢)。
lz对这方面的存储,有研究不? 可以考虑下淘宝的 metamorphosis,已经实现了HA复制。 看了下metamorphosis,我的几个需求基本能满足,数据不丢这个基于master/slave模式不一定能100%保证吧, master disk crash了之后,总会丢一些数据。 有对应的性能测试报告不? master/slave有两种模式,同步复制和异步复制,这跟mysql是机制是一样的。不过我更推荐异步复制,同步复制的性能会差一些,并且机制相对复杂。 另外,一般我们磁盘都做RAID,这样一来其实异步复制就可以接近100%的高可用。 性能测试报告内部有做,不过好像没放出来,性能很大程度上取决于磁盘和参数配置,磁盘是SATA还是SAS,参数主要是每隔多少秒force和每隔多少个消息force。总体上说,性能不是个问题。 一个印象数据,2K的消息,100个并发发送消息,每隔10秒force和每1000条消息force,TPS接近25000,磁盘是做RAID 10的SAS盘,15000转。如果是普通SATA盘,性能下降一半多。异步复制对性能没有影响。另外,在设置每条消息做force的情况下,会利用group commit技术来提高吞吐量,TPS不下降,但是CPU会上升很多。 有兴趣可以自己测试下。 看了下文档,存在几个疑问: 1. 引用 发送消息怎么保证有序? 只保证单线程发送的消息有序 只保证发送同一个分区的消息有序 实现自定义分区选择器 我的业务场景是:顺序推送数据到server,如果涉及到分区,那如果单个消费者在处理时,连接到多个分区后。多个分区的处理数据相比于原先的推送顺序,应该不能保持一致吧。 2. metamorphosis没看到topic的相关设计,不知道是不是我看漏了。MessageConsumer在订阅的时候没有传递订阅者id? 如果一个订阅者短暂型的crash了,对应这段时间产生的数据是否会继续给他保留? 我的业务场景比较特殊,主要是用于记录数据库的binlog/redolog的解析结果,需要保证顺序性,不然消费时进行数据同步,载入目标库语义上就会错乱。 publish性能有个万把tps就够用了,后端的订阅消费速度只有5000tps以下。 |
|
返回顶楼 | |
发表时间:2012-03-20
agapple 写道 看了下文档,存在几个疑问: 1. 引用 发送消息怎么保证有序? 只保证单线程发送的消息有序 只保证发送同一个分区的消息有序 实现自定义分区选择器 我的业务场景是:顺序推送数据到server,如果涉及到分区,那如果单个消费者在处理时,连接到多个分区后。多个分区的处理数据相比于原先的推送顺序,应该不能保持一致吧。 2. metamorphosis没看到topic的相关设计,不知道是不是我看漏了。MessageConsumer在订阅的时候没有传递订阅者id? 如果一个订阅者短暂型的crash了,对应这段时间产生的数据是否会继续给他保留? 1.发送者可以自定义分区选择器来保证需要顺序的消息发到同一个分区。 2.有的,meta同样有topic,consumer有group的概念,也就是你说的id,这个设计跟kafka是一样的,可以看kafka的设计文档。数据的保留跟订阅者没有关系,服务端会按照配置的策略保存消息,客户端什么时候上来都可以,只要消息还没有被服务器删除都可以读到。具体还是看kafka的设计文档。 |
|
返回顶楼 | |
发表时间:2012-03-20
最后修改:2012-03-20
dennis_zane 写道 agapple 写道 看了下文档,存在几个疑问: 1. 引用 发送消息怎么保证有序? 只保证单线程发送的消息有序 只保证发送同一个分区的消息有序 实现自定义分区选择器 我的业务场景是:顺序推送数据到server,如果涉及到分区,那如果单个消费者在处理时,连接到多个分区后。多个分区的处理数据相比于原先的推送顺序,应该不能保持一致吧。 2. metamorphosis没看到topic的相关设计,不知道是不是我看漏了。MessageConsumer在订阅的时候没有传递订阅者id? 如果一个订阅者短暂型的crash了,对应这段时间产生的数据是否会继续给他保留? 1.发送者可以自定义分区选择器来保证需要顺序的消息发到同一个分区。 2.有的,meta同样有topic,consumer有group的概念,也就是你说的id,这个设计跟kafka是一样的,可以看kafka的设计文档。数据的保留跟订阅者没有关系,服务端会按照配置的策略保存消息,客户端什么时候上来都可以,只要消息还没有被服务器删除都可以读到。具体还是看kafka的设计文档。 恩,大致明白了metamorphosis的设计,和我这边的需求有些少许差异。 1. 如果自定义了分区算法,比如需要顺序的分到一个区上,那对应的数据存储的扩展性是不是就没了,取决于一个分区的disk容量。说白了,我这边的所有数据都是有顺序性要求,但又要支持水平扩展性(通过增加机器扩充存储),又得保证数据不能丢失。 2. 针对订阅者的一个管理,我原先的想法是为每条消息定义一个全局顺序的id,记录每个subscribe消费到哪个id。定时的删除最后一个subscribe的message id之前的数据。也就是说只要有订阅者订阅过一次,subscribe的offest在,那对应的数据就永远不会被删除。不过我们还有个特殊的需求,就是希望数据可以做replay,消费过一次后,再连接上来后replay一次 我之前看了下bookkeeper + hedwig的实现,网络架构上有点复杂了,两层传输,可靠性要打点折扣。 |
|
返回顶楼 | |