由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大的坑, 确实是阿里云的技术文档里没有提及, 在文章的最后会给大家提及.

使用过程了封装的RocketMQ类库已开源在github: https://github.com/antaintan/easyrocketmq

公司的一位同事推荐使用RocketMQ, 并给出了几个流行MQ的对比, 资料来源, 阿里云帮助文档

目前RocketMQ已经成为Apache顶级项目, 作为开源软件免费提供. 但是阿里云提供的RocketMQ是收费的, 一个Topic 2元/天, 2元100万消息.具体价格,可以参照阿里云的报价.

详细对比资料地址: https://help.aliyun.com/document_detail/52577.htmlhttps://help.aliyun.com/document_detail/52577.html

(注: 阿里云的技术文档写得不错, 可以学习到很多知识)

  RocketMQ 是一个款非常强大的MQ, 它同时支持, 无序消息, 分区顺序消息, 全局顺序消息, 并支持TCP, Http协议接入.

  客户端支持Java, C++/.Net(.Net客户端是通过封装C++DLL,通过PInvoke调用来实现的, 基于x64位, 所以我们自己项目编译时也要选择x64)

特色功能

  • 事务消息,实现类似 X/Open XA 的分布事务功能,以达到事务最终一致性状态。
  • 定时(延时)消息,允许消息生产者指定消息进行定时(延时)投递,最长支持40天。
  • 大消息,目前默认支持最大 256KB 消息,华北2 地域支持最大 4MB 消息。
  • 消息轨迹,通过消息轨迹,用户能清晰定位消息从发布者发出,经由 MQ 服务端,投递给消息订阅者的完整链路,方便定位排查问题。
  • 广播消息,允许一个 Consumer ID 所标识的所有 Consumer 都会各自消费某条消息一次。
  • 顺序消息,允许消息消费者按照消息发送的顺序对消息进行消费。
  • 重置消费进度,根据时间重置消费进度,允许用户进行消息回溯或者丢弃堆积消息。

多协议接入

  • 支持 HTTP 协议:支持 RESTful 风格 HTTP 协议完成收发消息,可以解决跨语言使用 MQ 问题。
  • 支持 TCP 协议:区别于 HTTP 简单的接入方式,提供更为专业、可靠、稳定的 TCP 协议的 SDK 接入。

注意: Java客户端的TCP协议是功能支持最全的, .Net TCP要少一些功能支持如顺序消息, 而Http协议支持的更少, 具体情况, 请详细查阅阿里云的帮助文档.

消息队列的几个核心对象:

  • Topic: 消息主题
  • Consumer: 消息消费者, 消费订阅的主题消息
  • Producer: 消息生产者, 生产不同的消息

  阿里提供的.Net类库几个核心类库:

NSClient4CPP.lib, c++类库

ONSClient4CPP.dll, c++类库

ONSClient4CPP.pdb c++类库

ons.dll: Net类库, 利用开源软件 SWIG 生成 PINVOKE 封装代码

如果系统没有c++运行时类库, 还需要安装vc_redist.x64.exe.

下面是生产者示例代码:

private static ProducerClient producerClient = new ProducerClient(AccessKeyId, AccessKeySecret, ProducerId);

private static void Main(string[] args)
{
producerClient.Start(); var stopWatch = new Stopwatch();
stopWatch.Start(); var taskList = new List<Task>();
for (int threadIndex = ; threadIndex <= ProducerThreadCount; threadIndex++)
{
// 生产消费
var task = Task.Factory.StartNew(() => {
for (int messageIndex = ; messageIndex <= MessageCountPerThread; messageIndex++)
{
string content = "线程ID=" + Thread.CurrentThread.ManagedThreadId + ", 我要测试rocketmq message";
//producerClient.SendMessage(ShardingKey, Topic, content, Tag);
producerClient.SendMessage(Topic, content, Tag); Console.WriteLine(content);
}
}, TaskCreationOptions.LongRunning); taskList.Add(task);
} Task.WaitAll(taskList.ToArray());
stopWatch.Stop(); // 一定要关闭,不然会有内存泄漏
producerClient.Shutdown(); Console.WriteLine("发送消息:{0}条, 使用时间{1}毫秒", MessageCountPerThread * ProducerThreadCount, stopWatch.ElapsedMilliseconds);
Console.ReadLine();
}

下面是消费者示例代码
private static PushConsumerClient consumerClient = new PushConsumerClient(AccessKeyId, AccessKeySecret, Topic, ConsumerId, SubExpression);

private static int count = ;

private class MyMsgListener : DefaultMessageListener
{
public override ons.Action consume(Message message, ConsumeContext context)
{
Console.WriteLine("消息序号: {0}, 当前线程ID = {1}, 内容为: {2}", ++count, Thread.CurrentThread.ManagedThreadId, message.getBody());
return ons.Action.CommitMessage;
}
} private static void Main(string[] args)
{
var listener = new MyMsgListener();
consumerClient.setMessageListener(listener);
consumerClient.Start(); Console.ReadLine();
consumerClient.Shutdown();
}

  消费者有一个消息监听类, 有个consume方法, 这里趟过一个大坑, 因为为了省去一个类文件, 就用了匿名方法来代替上面的监听类, 结果只要消息一条消息后, 程序就自动死, 没有任何.net错误信息, 只有一个很底层的错误, 得不到任何有价值的信息, 花了很多时间, 才发现是因为匿名方法通过PPInvoke调用会有问题.后面换成监听类, 问题就解决了.

[原创]阿里云RocketMQ踩过的哪些坑的更多相关文章

  1. 阿里云RocketMQ的生产者简单实现

    // MQ的应用场景有比如 订单变更消息可以通过产生这个事件的地方(比如前端调用后端的接口post一个订单,那么就是在这个mapping方法里做一个生产者[不过最好通过aop来实现,不然n多个接口都要 ...

  2. 阿里云RocketMQ定时/延迟消息队列实现

    新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...

  3. Spring boot实战项目整合阿里云RocketMQ (非开源版)消息队列实现发送普通消息,延时消息 --附代码

    一.为什么选择RocketMQ消息队列? 首先RocketMQ是阿里巴巴自研出来的,也已开源.其性能和稳定性从双11就能看出来,借用阿里的一句官方介绍:历年双 11 购物狂欢节零点千万级 TPS.万亿 ...

  4. 阿里云RocketMQ的消费者简单实现

    业务场景之类的请看另一篇生产者的实现: package com.ttt.eee; import com.aliyun.openservices.ons.api.Action; import com.a ...

  5. 用阿里云ecs部署kubernetes/K8S的坑(VIP、slb、flannel、gw模式)

    1 阿里云ecs不支持keepalived vip 1.1 场景描述 本来计划用keepalived配合nginx做VIP漂移,用以反代多台master的apiserver的6443端口,结果部署了v ...

  6. 阿里云上部署kafka--遇到的坑

    阿里云防火墙关闭,并且配置规则.不然会导致访问不到服务. 问题一: Caused by: java.net.UnknownHostException: iZuf68tztea6l5ccdz7wemZ: ...

  7. Docker 部署阿里云RocketMQ 4.5.1

    搜索镜像 docker search rocketmq 查看镜像版本 如果要查看其它的镜像,只需要将其中的镜像名称foxiswho/rocketmq替换为其它镜像即可 curl https://reg ...

  8. [原创]Mac系统下制作OS 10.11安装镜像

    一.所需软件 1.从App Store下载OS X El Capitan 10.11.2 ------------------------------------------------------- ...

  9. [原创]纯JS实现网页中多选复选框checkbox和单选radio的美化效果

    图片素材: 最终效果图: <html><title> 纯JS实现网页中多选复选框checkbox和单选radio的美化效果</title><head>& ...

随机推荐

  1. 记录一下从懵懂到理解RESTful的过程

    前言 Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)R ...

  2. webpack2使用ch1-目录说明

    1 目录解释  webpack.config.js:配置文件,配置文件可以改成其他名,但package.json --config文件名称也要对应修改 2 webpack.config.js //we ...

  3. Sql Server合并多行询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数

    示例表 tb 数据如下 id value ----- 1 aa 1 bb 2 aaa 2 bbb 2 ccc SELECT id, [val] = ( SELECT [value] + ',' FRO ...

  4. dom4j之小小工具

    dom4j经常不用,方法忘了又记,故做出读取xml和把document写入xml的小小工具~~~ /** * 读取document和将document对象写入到xml的小工具 * 使用该类必须给出do ...

  5. 详解面向对象编程——JavaScriptOOP

        前  言 絮叨絮叨 学习了JS之后,不知道大家觉得怎们样呢? 今天我们就来讲一下JS中最重要的一个环节,JavaScript中的面向对象编程OOP,这里的东西有点难,也有点绕. 可是! 不要灰 ...

  6. Excel导出插件

    前言 一个游戏通常需要10多个Excel表格或者更多来配置,一般会通过导出csv格式读取配置. 本文提供导出Excel直接生成c#文件,对应数据直接生成结构体和数组,方便开发排错和简化重复写每个表格的 ...

  7. C#仪器数据文件解析-Word文件(doc、docx)

    不少仪器数据报告输出为Word格式文件,同Excel文件,Word文件doc和docx的存储格式是不同的,相应的解析Word文件的方式也类似,主要有以下方式: 1.通过MS Word应用程序的DCOM ...

  8. 每天十分钟系列:JS数据操作之神奇的map()

    Array.prototype.map() map()方法可以创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. demo1 上面的例子,在控制台中打印的结果是: 1 2 3 ...

  9. 初识SQL Server2017 图数据库(一)

    背景: 图数据库对于表现和遍历复杂的实体之间关系是很有效果的.而这些在传统的关系型数据库中尤其是对于报表而言很难实现.如果把传统关系型数据库比做火车的话,那么到现在大数据时代,图数据库可比做高铁.它已 ...

  10. Ubuntu安装Flash视频插件

    http://www.linuxidc.com/Linux/2014-05/101095.htm