正如在上一篇文章中写道:“据我所知,现在RocketMQ还没有中文文档。我打算自己试着在github上开一个项目,自行翻译。”我这几天抽空翻译了文档的前3个小节,发现翻译真的不是一件容易的事情,即便只是翻译这种语言复杂程度较低的技术文档。

翻译文档有很多好处,首先一点就是可以提升阅读英文文档的水平。现在很多开源项目都是国外的,即便是国内的开源项目,为了国际化影响也是先出英文文档,眼前的例子就是RocketMQ。然后,就是翻译文档分享出来,能够帮助一些英文水平还有待提高的开发者朋友们,让他们也尽快能读到阅读体验更好的项目文档。

翻译要求三个字,信、达、雅。我的翻译还远远没有到这个程度,纯属抛砖引玉。官方文档链接为http://rocketmq.apache.org/docs/motivation ,请对照阅读。


为什么是RocketMQ

动机

在早期阶段,我们在ActiveMQ 5.x(早于5.3)的基础上构建我们的分布式消息中间件。我们的跨国业务使用它来实现异步通信、检索、社交网络活动流、数据管道,甚至在交易过程中也在使用。随着我们的交易业务量增加,来自消息集群的压力与日俱增,亟需解决。

为什么是RocketMQ

根据我们的研究,随着使用中的队列越来越长、虚拟主题越来越多,ActiveMQ的IO模型会到达一个瓶颈。我们尽力地试图通过节流、断路器或者降级这些手段来解决这个问题,但是都没有很好的效果。因此,我们开始注意到当时非常流行的消息解决方案,Kafka。不走运的是,Kafka并不能满足我们的需求,尤其是在低延迟和高可用这两点上,点击链接进一步了解细节。

在这样的情况下,我们决定写一个全新的消息引擎来处理这一类用途更广泛的使用案例,囊括范围从传统的发布/订阅情景到高流量实时零差错交易系统。我们相信这个解决方案能带来好处,所以我们非常愿意把这个项目向社区开源。今时今日,已经有超过100家企业在他们的业务里采用开源版本的RocketMQ。我们也在阿里云平台发布了一个基于RocketMQ的商业版PaaS产品。

下面这张表格对比了RocketMQ、ActiveMQ和Kafaka(Apache里最受欢迎的基于java的消息解决方案)

RocketMQ vs. ActiveMQ vs. Kafka

(译者注:markdown要完整实现这个表格比较复杂,暂且搁置,延后处理)

快速开始

快速开始指引由详细的命令组成,告诉你如何在本机配置RocketMQ消息投递系统并且收发消息。

前期必要的准备

以下软件必须安装:

  1. 64位操作系统,linux/Unit/Mac(推荐);
  2. 64位JDK,1.8+;
  3. Maven 3.2.x
  4. Git

克隆代码仓库和构建程序

  1. 1
    2
    3
    4
  1. > git clone -b develop https://github.com/apache/rocketmq.git
    > cd rocketmq
    > mvn -Prelease-all -DskipTests clean install -U
    > cd distribution/target/apache-rocketmq

(译者注:命令集合无需翻译。下同。)

启动Name Server

  1. 1
    2
    3
  1. > nohup sh bin/mqnamesrv &
    > tail -f ~/logs/rocketmqlogs/namesrv.log
    The Name Server boot success...

启动Broker

  1. 1
    2
    3
  1. > nohup sh bin/mqbroker -n localhost:9876 &
    > tail -f ~/logs/rocketmqlogs/broker.log
    The broker[%s, 172.30.30.233:10911] boot success...

发送和接收消息

在发送或接收消息之前,我们需要通知客户端name servers的位置。RocketMQ提供多种实现方式。为简单起见,我们现在展示环境变量NAMESRV_ADDR的用法

  1. 1
    2
    3
    4
    5
    6
  1. > export NAMESRV_ADDR=localhost:9876
    > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
    SendResult [sendStatus=SEND_OK, msgId= ...

    > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
    ConsumeMessageThread_%d Receive New Messages: [MessageExt...

关闭所有服务器

  1. 1
    2
    3
    4
    5
    6
    7
  1. > sh bin/mqshutdown broker
    The mqbroker(36695) is running...
    Send shutdown request to mqbroker(36695) OK

    > sh bin/mqshutdown namesrv
    The mqnamesrv(36664) is running...
    Send shutdown request to mqnamesrv(36664) OK

简单的消息示例

使用RocketMQ发送消息的3种方法:可靠同步发送、可靠异步发送和单向发送

本页文档展示这3种消息发送方式。检出这些带有注释的示例代码,可以让你知道每一个用例对应哪一种发送方式。

可靠同步发送

应用:可靠同步发送在众多场景中被使用,例如重要的通知消息、短信通知、短信营销系统,等等。

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
  1. public class SyncProducer {
    public static void main(String[] args) throws Exception {
    //Instantiate with a producer group name.
    DefaultMQProducer producer = new
    DefaultMQProducer("please_rename_unique_group_name");
    //Launch the instance.
    producer.start();
    for (int i = 0; i < 100; i++) {
    //Create a message instance, specifying topic, tag and message body.
    Message msg = new Message("TopicTest" /* Topic */,
    "TagA" /* Tag */,
    ("Hello RocketMQ " +
    i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
    );
    //Call send message to deliver message to one of brokers.
    SendResult sendResult = producer.send(msg);
    System.out.printf("%s%n", sendResult);
    }
    //Shut down once the producer instance is not longer in use.
    producer.shutdown();
    }
    }

可靠异步发送

Application: asynchronous transmission is generally used in response time sensitive business scenarios.
应用:异步发送通常被用于对响应时间敏感的业务场景

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
  1. public class AsyncProducer {
    public static void main(String[] args) throws Exception {
    //Instantiate with a producer group name.
    DefaultMQProducer producer = new DefaultMQProducer("ExampleProducerGroup");
    //Launch the instance.
    producer.start();
    producer.setRetryTimesWhenSendAsyncFailed(0);
    for (int i = 0; i < 100; i++) {
    final int index = i;
    //Create a message instance, specifying topic, tag and message body.
    Message msg = new Message("TopicTest",
    "TagA",
    "OrderID188",
    "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
    producer.send(msg, new SendCallback() {
    @Override
    public void onSuccess(SendResult sendResult) {
    System.out.printf("%-10d OK %s %n", index,
    sendResult.getMsgId());
    }
    @Override
    public void onException(Throwable e) {
    System.out.printf("%-10d Exception %s %n", index, e);
    e.printStackTrace();
    }
    });
    }
    //Shut down once the producer instance is not longer in use.
    producer.shutdown();
    }
    }

单向发送

Application: One-way transmission is used for cases requiring moderate reliability, such as log collection.
应用:单向发送用于要求一定可靠性的场景,例如日志收集。

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
  1. public class OnewayProducer {
    public static void main(String[] args) throws Exception{
    //Instantiate with a producer group name.
    DefaultMQProducer producer = new DefaultMQProducer("ExampleProducerGroup");
    //Launch the instance.
    producer.start();
    for (int i = 0; i < 100; i++) {
    //Create a message instance, specifying topic, tag and message body.
    Message msg = new Message("TopicTest" /* Topic */,
    "TagA" /* Tag */,
    ("Hello RocketMQ " +
    i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
    );
    //Call send message to deliver message to one of brokers.
    producer.sendOneway(msg);

    }
    //Shut down once the producer instance is not longer in use.
    producer.shutdown();
    }
    }

最后说点什么

翻译文档的地址在https://github.com/levenYes/RocketMQ-ChineseDoc.

感兴趣的朋友可以关注一下,给个Star。我会陆陆续续把文档翻译好,上传上去。如果有志同道合的朋友想参与进来,可以试着翻译一两节,然后新建一个Pull request。或者直接发邮件给到我的邮箱levenyes@icloud.com,互相沟通交流学习。

我有一个公众号,经常会发一些看书思考过后写的文章。

如果你喜欢我的文字,可以用微信搜索“李文业的思考笔记”或者扫描二维码关注。

为开源社区尽一份力,翻译RocketMQ官方文档的更多相关文章

  1. Apache Flume入门指南[翻译自官方文档]

    声明: 根据官方文档选择性的翻译了下,不对请指正 https://flume.apache.org/FlumeUserGuide.html

  2. 自己翻译 delegation 官方文档

    什么是代理,知道怎么用,见过N次.会用代理传值,还不够.代理到底是用来干嘛的嘛?还是看看官方文档吧,自己翻译出来看看是不是通顺 代理: 代理是一个简单高效的模式,尤其是一个类在编程的过程中代表或者需要 ...

  3. [翻译]PyMongo官方文档

    PyMongo官方文档翻译 周煦辰 2016-06-30 这是本人翻译的PyMongo官方文档.现在网上分(抄)享(袭)的PyMongo博客文章很多,一方面这些文章本就是抄袭的,谈不上什么格式美观,另 ...

  4. [翻译]Android官方文档 - 通知(Notifications)

    翻译的好辛苦,有些地方也不太理解什么意思,如果有误,还请大神指正. 官方文档地址:http://developer.android.com/guide/topics/ui/notifiers/noti ...

  5. 我为什么要翻译ES6官方文档

    ES6出来很久了,现在网上也有很多教程,其中以阮一峰老师的教程最为经典.大家通过学习阮老师的教程肯定能学懂ES6最新的技术. ES6官方文档是一个规范,各浏览器在实现ES6的具体API时都会遵循它.我 ...

  6. Android Support Library 23.2介绍(翻译自官方文档)

    Android Support Library 23.2 (译者注:本文标注了部分文字链接,但须要***,要查看全部链接.请查看sukey=014c68f407f2d3e181b6b5e665f26a ...

  7. 【Android开发】Android Host详解(翻译自官方文档)

    原文:http://android.eoe.cn/topic/summary 文档内容 API概述 Android中manifest文件需求 工作的设备 * 发现设备 * 获得和设备进行“交流”的权限 ...

  8. [技术翻译]Guava官方文档Ordering

    关于排序 Guava的链式比较器 例子 assertTrue(byLengthOrdering.reverse().isOrdered(list)); 梗概 Ordering是Guava的链式比较器类 ...

  9. 别开心太早,Python 官方文档的翻译差远了

    近几天,很多公众号发布了 Python 官方文档的消息.然而,一个特别奇怪的现象就发生了,让人啼笑皆非. Python 文档的中文翻译工作一直是“默默无闻”,几个月前,我还吐槽过这件事<再聊聊P ...

随机推荐

  1. Java中方法的重载和重置(覆盖)的区别

    简单来说,重载就是在同一类中允许同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可,而重置(覆盖)是子类重新定义父类中己经定义的方法,即子类重写父类方法. 方法的重载 方法的重载就是在同 ...

  2. 用iptables 做NAT代理上网

    背景:有一台A服务器不能上网,和B服务器通过内网来连接,B服务器可以上网,要实现A服务器也可以上网. 内网主机: A eth1:172.16.1.8 外网主机: B eth0:10.0.0.61外网主 ...

  3. rsync服务精讲 -- 视频

    rsync服务 开源数据同步工具rsync视频(老男孩分享) 浏览网址 01-rsync基础介绍 http://oldboy.blog.51cto.com/2561410/1216550 11-rsy ...

  4. 区分window8中 ie10 window phone8

    Internet Explorer 10 并没有对 屏幕的宽度 和 视口(viewport)的宽度 进行区分   @-webkit-viewport   { width: device-width; ...

  5. Windows命令行command的Shell命令详细解析和语法

    CMD命令大全及详细解释和语法 Microsoft Windows XP [版本 5.1.2600] 有关某个命令的详细信息,请键入 HELP 命令名 ASSOC    显示或修改文件扩展名关联. A ...

  6. C#获取存储过程的 Return返回值和Output输出参数值

    1.获取Return返回值  程序代码 //存储过程//Create PROCEDURE MYSQL//     @a int,//     @b int//AS//     return @a + ...

  7. C#去掉字符串头尾指定字符

    private void button2_Click(object sender, EventArgs e)        {//去掉字符串头尾指定字符            string MyInf ...

  8. 深度学习的异构加速技术(一):AI 需要一个多大的“心脏”?

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:kevinxiaoyu,高级研究员,隶属腾讯TEG-架构平台部,主要研究方向为深度学习异构计算与硬件加速.FPGA云.高速视觉感知等方向 ...

  9. JAVA提高十三:Hashtable&Properties深入分析

    最近因为一些琐碎的事情,导致一直没时间写博客,正好今天需求开发完的早,所以趁早写下本文,本文主要学习的是Hashtable的分析,因为上面一篇文章研究的是HashMap,而Hashtable和Hash ...

  10. 使用vue2.x+webpack+vuex+sass+axios+elementUI等快速搭建前端项目框架

    一.本文将分享如何快速搭起基于webpack+vue的前端项目框架,利用vue的自己的脚手架工具vue-cli搭建起基本的环境配置,再通过npm包管理工具引入相应的依赖来完善项目的各种依赖框架.下面是 ...