MetaQ的基础

建议阅读:中间件学习——metaq-阿里云开发者社区

http://events-docs.devops.xiaohongshu.com/guide/rocketmq.html

一.metaq调用链路

特点:

1.支持严格的消息顺序

2.支持Topic与Queue两种模式

3.亿级消息堆积能力

4.比较友好的分布式特性

5.同时支持Push与Pull方式消费消息

消息生产者负责创建消息并发送到Meta服务器(Broker),Meta服务器会将消息持久化到磁盘,消息消费者从Meta服务器拉取消息并提交给应用消费

二.消息持久性

metaq 接收到消息之后,会先把消息持久化到本地。
常用的持久化方式:

  • 持久化到DB
  • 持久化到KV存储,如levelDB,伯克利DB
  • 持久化到文件

metaq使用的是 持久化到文件 ,并充分利用Linux文件系统内存cache来提高性能。
注: 持久化部分的性能会直接影响消息中间件的性能。

消息堆积能力:metaq每台服务器提供大约亿级的消息堆积能力(多个业务方共用),超过堆积阈值,订阅消息吞吐量会下降。

三.metaq架构&消息的收发

Broker分为master和slave。每个Broker与nameserver集群中的所有节点建立长连接,定时注册topic信息到所有的nameServer。

Producer与nameServer集群中的一个节点(随机)建立长连接,定期从nameServer 取topic路由信息,并向提供topic服务的master broker建立长连接,且定时向master发送心跳。Producer发布消息是发布到master,在由master同步到所有broker。

Consumer与nameServer集群中的一个节点建立长连接,定期从nameServer取topic的路由信息,并向提供topic服务的master、slave broker建立长连接,并定时向master、slave发送心跳。Comsumer既可以从slave订阅消息,也可以从master订阅消息。

metaq采用发布-订阅模型,发布者发布消息到metaq,订阅者向metaq订阅消息。
消息的消费方式是pull方式,由消费者主动从metaq服务器拉取数据,解析成消息并消费。

消息中间件中有两个角色: "消息生产者(Producer)"和"消息消费者(Consumer)"。Meta里同样有这两个概念,消息生产者负责创建消息并发送到Meta服务器(Broker),Meta服务器会将消息持久化到磁盘,消息消费者从Meta服务器拉取消息并提交给应用消费

四.具体使用

目前很多公司并不会直接使用metaq,都是在metaq的基础上进行封装,公司内部有一套非常详细的使用文档。

@Data
@Configuration
public class ProducerConfig {
    @Value("${rocketmq.address:xxxxx:xxxx}")
    private String namesrvAddr;

    @Value("${rocketmq.xxx.producer:xxx}")
    private String pubProducerGroup;


    @Resource
    private RocketMQConfig rocketMQConfig;

    
    @Bean("pubMqClient")
    RocketMQProducer pubMqClient() throws MQClientException {
        return rocketMQConfig.createProducer(namesrvAddr, pubProducerGroup);
    }

}

@Slf4j
@Service
public class PubProducer {
    @Resource
    private RocketMQProducer pubtMqClient;

    @Value("${rocketmq.xxx.topic:xxx}")
    private String pubTopic;

    
    public SendResult pubMsg(String keys, String tag, String body) {
        try {
            Message message = new Message();
            message.setTopic(pubTopic);
            message.setTags(tag);
            message.setKeys(keys);
            message.setBody(body.getBytes());
            return pubMqClient.pub(message);
        } catch (Exception e) {
            log.error("pubMsg error. keys:{} body:{}", keys, body, e);
        }
        return null;
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值