在一篇博文里面看到说阿里系对.NET不友好,这几天搞下来深以为然,下面慢慢说。
公司最近上了项目要用RocketMQ,我就接手了.NET客户端的工作。刚接手的时候觉得应该问题不大,毕竟RocketMQ现在也算是Apache的顶级开源项目了,网上的文档不说是铺天盖地,也算是应有尽有了,所以也没当回事。
先准备再nuget上找个客户端的库来跑跑看,于是建了个控制台程序,搜了一圈下来才发现事情似乎没有想象中那么简单。
居然只有7个可用的稳定版本的nuget包,这有点出乎我的意料了。于是秉着“最好有例子,最好有项目代码(Github)”的思路,选了三个库来测试,结果都不能令人满意,下面一个一个来说。
首先是NewLife.RocketMQ,这个团队在博客园看到过,有不少开源项目,挺好。
说回客户端,跑完demo之后发现的问题是会消费所有未过期的消息,导致会有重复消息被拉回客户端,所以要考虑自己处理这块的问题,
另外因为这个客户端是从头写的纯托管代码,所以相比官方的roocketmq-client来说,不完善是在所难免的,而我的目的是找到一个完善可用的客户端,所以只能放弃。
第二个是RocketMQ-Client,是基于ikvm转换Rocket MQ的dot net客户端。
测试结果是不能满足要求,因为服务端需要提供SessionCredentials,而且这块完全没有。
var hook = new AclClientRPCHook(new SessionCredentials("XXXX", "XXXX"));
不过我受它的思路指引,把最新的4.6.1版本的RocketMQ包下载了下来,用IKVM自己转换了一遍,花了整整一下午时间,把所有转换过程中的警告提示尽可能的去掉了,但是结果是。。。还是不行
尽管我的代码完全已经可以编译通过,并且运行,但是还是死活收不到服务器的消息回调,花了一下午也只能放弃。
最后来说说rocketmq-client-dotnet,这是一个基于官方roocketmq-client-cpp项目经过P/Invoke调用之后封装的客户端。
最开始测试的时候一收到消息回调就会马上崩溃,本来是不算用它的,而且项目使用的roocketmq-client-cpp也不清楚是哪个版本的,怕太老了搭配项目上最新的4.6.1版本有问题,
但是兜兜转转一圈回来之后还是决定用这种方式,准备自己编译最新版本的roocketmq-client-cpp,发布还不到半个月,配合服务器端应该没什么问题了,不过编译的过程也是踩坑不断,具体过程另文再说了。
最后自己编译了x64的Release和Debug版本,同时也解决了收到消息回调之后程序崩溃的问题,算是有了个圆满的结果。
BTW:这期间我还试图用阿里云的RocketMQ版SDK来连接项目的RocketMQ,可是无果,不得已发了个工单问问,最终确认是“阿里云的sdk不可以在开源的rocketmq中使用的。”,
所以额,没什么说的了,友好不友好什么的,哈哈,毕竟上帝的归上帝,凯撒的归凯撒,也没啥毛病。