`
wbj0110
  • 浏览: 1604406 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

MetaQ 可靠性、顺序和重复

阅读更多

可靠性

Metamorphosis的可靠性保证贯穿客户端和服务器。

生产者的可靠性保证

消息生产者发送消息后返回SendResult,如果isSuccess返回为true,则表示消息已经确认发送到服务器并被服务器接收存储。整个发送过程是一个同步的过程。保证消息送达服务器并返回结果。

服务器的可靠性保证

消息生产者发送的消息,meta服务器收到后在做必要的校验和检查之后的第一件事就是写入磁盘,写入成功之后返回应答给生产者。因此,可以确认每条发送结果为成功的消息服务器都是写入磁盘的。

写入磁盘,不意味着数据落到磁盘设备上,毕竟我们还隔着一层os,os对写有缓冲。Meta有两个特性来保证数据落到磁盘上

  • 每1000条(可配置),即强制调用一次force来写入磁盘设备。
  • 每隔10秒(可配置),强制调用一次force来写入磁盘设备。

因此,Meta通过配置可保证在异常情况下(如磁盘掉电)10秒内最多丢失1000条消息。当然通过参数调整你甚至可以在掉电情况下不丢失任何消息。

服务器通常组织为一个集群,一条从生产者过来的消息可能按照路由规则存储到集群中的某台机器。Meta已经实现高可用的HA方案,类似mysql的同步和异步复制,将一台meta服务器的数据完整复制到另一台slave服务器,并且slave服务器还提供消费功能(同步复制不提供消费)。

消费者的可靠性保证

消息的消费者是一条接着一条地消费消息,只有在成功消费一条消息后才会接着消费下一条。如果在消费某条消息失败(如异常),则会尝试重试消费这条消息(默认最大5次),超过最大次数后仍然无法消费,则将消息存储在消费者的本地磁盘,由后台线程继续做重试。而主线程继续往后走,消费后续的消息。因此,只有在MessageListener确认成功消费一条消息后,meta的消费者才会继续消费另一条消息。由此来保证消息的可靠消费。

消费者的另一个可靠性的关键点是offset的存储,也就是拉取数据的偏移量。我们目前提供了以下几种存储方案

  • zookeeper,默认存储在zoopkeeper上,zookeeper通过集群来保证数据的安全性。
  • mysql,可以连接到您使用的mysql数据库,只要建立一张特定的表来存储。完全由数据库来保证数据的可靠性。
  • file,文件存储,将offset信息存储在消费者的本地文件中。

Offset会定期保存,并且在每次重新负载均衡前都会强制保存一次。

顺序

很多人关心的消息顺序,希望消费者消费消息的顺序跟消息的发送顺序是一致的。比如,我发送消息的顺序是A、B、C,那么消费者消费的顺序也应该是A、B、C。乱序对某些应用可能是无法接受的。

Metamorphosis对消息顺序性的保证是有限制的,默认情况下,消息的顺序以谁先达到服务器并写入磁盘,则谁就在先的原则处理。并且,发往同一个分区的消息保证按照写入磁盘的顺序让消费者消费,这是因为消费者针对每个分区都是按照从前到后递增offset的顺序拉取消息。

Meta可以保证,在单线程内使用该producer发送的消息按照发送的顺序达到服务器并存储,并按照相同顺序被消费者消费,前提是这些消息发往同一台服务器的同一个分区。为了实现这一点,你还需要实现自己的PartitionSelector用于固定选择分区

public interface PartitionSelector {
    public Partition getPartition(String topic, List<Partition> partitions, Message message) throws MetaClientException;
}

选择分区可以按照一定的业务逻辑来选择,如根据业务id来取模。或者如果是传输文件,可以固定选择第n个分区使用。当然,如果传输文件,通常我们会建议你只配置一个分区,那也就无需选择了。

消息的顺序发送我们在1.2这个版本提供了OrderedMessageProducer,自定义管理分区信息,并提供故障情况下的本地存储功能。

消息重复

消息的重复包含两个方面,生产者重复发送消息以及消费者重复消费消息。

针对生产者来说,有可能发生这种情况,生产者发送消息,等待服务器应答,这个时候发生网络故障,服务器实际已经将消息写入成功,但是由于网络故障没有返回应答。那么生产者会认为发送失败,则再次发送同一条消息,如果发送成功,则服务器实际存储两条相同的消息。这种由故障引起的重复,meta是无法避免的,因为meta不判断消息的data是否一致,因为它并不理解data的语义,而仅仅是作为载荷来传输。

针对消费者来说也有这个问题,消费者成功消费一条消息,但是此时断电,没有及时将前进后的offset存储起来,则下次启动的时候或者其他同个分组的消费者owner到这个分区的时候,会重复消费该条消息。这种情况meta也无法完全避免。

Meta对消息重复的保证只能说在正常情况下保证不重复,异常情况无法保证,这些限制是由远程调用的语义引起的,要做到完全不重复的代价很高,meta暂时不会考虑。

分享到:
评论

相关推荐

    Metaq原理与应用

    Metaq 的设计考虑了性能、扩展性和可靠性,通过这些特性,它能够有效地处理大规模消息传输场景,适用于大数据处理、日志收集、实时监控等多种业务需求。同时,Metaq 的灵活性使其能够适应不断变化的业务环境,为构建...

    metamorphosis(metaq)

    MetaQ的设计目标是提供低延迟、高吞吐量的通信机制,同时具备强大的容错能力和可扩展性。在阿里巴巴的电商生态中,MetaQ扮演着关键角色,负责处理如订单创建、库存更新等业务流程中的消息传递。 二、MetaQ架构 ...

    metaQ向spark传数据

    在大数据处理领域,MetaQ和Spark是两个非常关键的组件。MetaQ是腾讯开源的一款...整个过程中,理解并掌握Spark Streaming的原理和MetaQ的特性是至关重要的,同时,灵活运用各种工具和库能提高数据处理的效率和可靠性。

    metaq-server-1.4.6.2客户端+服务端

    6. **消息顺序**:在特定场景下,MetaQ可以保证消息的顺序性,确保数据的一致性。 7. **监控与管理**:提供监控工具和管理界面,方便用户查看和管理消息队列的状态,进行问题排查。 **MetaQ服务端** MetaQ的...

    metaq-server-1.4.6.2.zip 和原版一样就是换了个名字

    综上所述,MetaQ服务器1.4.6.2版本在保持原有功能的基础上,可能针对性能、稳定性和扩展性等方面进行了优化,为大型分布式系统提供了可靠的、高性能的消息传递解决方案。对于开发者和运维人员来说,理解并熟练运用...

    metaq-server-1.4.6.2.tar.gz

    MetaQ在阿里巴巴内部已经广泛应用于日志收集、订单处理、库存同步等场景,展现了其强大的实时性和可靠性。 二、MetaQ Server 1.4.6.2特性 1. 高可用:MetaQ Server通过主备切换机制确保服务的连续性,当主节点故障...

    Metaq在JDk 7下的异常及解决方案

    《Metaq在JDK 7下的异常及其解决策略》 Metaq是一款高性能的消息中间件,广泛应用于分布式系统中,...同时,对于任何依赖特定JDK版本的组件,开发者都应持续关注版本更新带来的潜在影响,以确保系统的健壮性和兼容性。

    MetaQ 分布式消息服务中间件.pdf

    综上所述,MetaQ分布式消息服务中间件在架构设计上采用了分布式和高可用性的关键设计,其包含的特性如消息过滤、消息持久化、以及多种消息复制模式都是为了满足现代分布式系统对于消息队列服务的高性能、高可靠性和...

    metaQ的安装包

    MetaQ 提供了高可用、高可靠的消息服务,支持多种消息模型,如点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)模式,能够有效地解耦应用组件,提高系统的灵活性和可扩展性。 在安装 MetaQ 之前,我们...

    Metaq详细手册.docx

    4. **分布式架构**:Metaq支持分布式部署,生产者、服务器和消费者都可以分布在网络的不同节点上,提供了良好的扩展性和容错能力。 5. **增强特性**: - **Java重写**:Metaq采用Java语言完全重写,利用高效的协议...

    metaq消息中间件服务端、客户端资源汇集

    Metamorphosis是淘宝开源的一个Java消息中间件,他类似apache-kafka,但不是一个简单的山寨拷贝,而是做了很多改进和优化,项目的主页在淘蝌蚪上。服务端、客户端、javadoc都包含在内。

    阿里消息中间件MetaQ学习Demo.zip

    阿里消息中间件MetaQ学习Demo

    支付宝钱包系统架构内部剖析(架构图)

    - **配套项目**:为了进一步提升MetaQ的易用性和扩展性,支付宝团队还开发了一系列配套项目,包括Python客户端、Twitter Storm的Spout、Tail4j等工具。 ### 总结 通过上述分析可以看出,支付宝钱包系统的架构设计...

    【系统架构】最全最强解析:支付宝钱包系统架构内部剖析(架构图).docx

    支付宝钱包系统架构内部剖析 支付宝钱包系统架构概况: 支付宝钱包系统架构是...4. 分布式环境下(broker,producer,consumer都为集群)的消息路由,对顺序和可靠性有极高要求的场景 5. 作为一般MQ来使用的其他功能

    万亿级数据洪峰下的消息引擎.pdf

    2. 顺序消息:确保消息的顺序性和一致性。 3. 事务消息:确保消息的可靠性和一致性。 4. 消息过滤:基于消息tag、属性进行过滤,提高消息处理效率。 三、双十一万亿数据洪峰的挑战 双十一是阿里巴巴的电商平台的...

    RocketMQ技术原理

    其主要解决消息中间件在生产实践中遇到的问题,如消息发布/订阅、消息优先级、消息顺序、消息过滤、消息持久化、消息可靠性、低延迟消息等。它支持如至少一次、精确一次的多种消息传递语义,应对消息丢失和消息重复...

    支付宝之所以牛逼的原因:来看内部架构剖析

    Metamorphosis(MetaQ)是一个高性能、高可用、可扩展的分布式消息中间件,类似于LinkedIn的Kafka,具有消息存储顺序写、吞吐量大和支持本地和XA事务等特性,适用于大吞吐量、顺序消息、广播和日志数据传输等场景,在...

    RocketMQ原理简介

    它支持消息发布订阅模式、消息顺序性、消息过滤、消息持久化、消息可靠传输等多种特性,并针对消息中间件常遇到的问题如消息堆积、消息消费失败等提供了相应的解决策略。 消息中间件主要需要解决的问题包括消息发布...

Global site tag (gtag.js) - Google Analytics