云服务器内容精选

  • 通过访问控制,保护数据安全性 建议对不同角色的 IAM 用户仅设置最小权限,避免权限过大导致数据泄露或被误操作。 为了更好的进行权限隔离和管理,建议您配置独立的IAM管理员,授予IAM管理员IAM策略的管理权限。IAM管理员可以根据您业务的实际诉求创建不同的用户组,用户组对应不同的数据访问场景,通过将用户添加到用户组并将IAM策略绑定到对应用户组,IAM管理员可以为不同职能部门的员工按照最小权限原则授予不同的数据访问权限,详情请参见权限管理。 建议配置安全组访问控制,保护您的数据不被异常读取和操作。 参照表1配置安全组的入方向规则限制,控制连接实例的网络范围,避免DMS for RocketMQ暴露给不可信的第三方。 表1 安全组规则 实例版本 方向 协议 端口 源地址 说明 4.8.0 5.x 入方向 TCP 8100 访问DMS for RocketMQ实例的客户端地址,应避免设置为0.0.0.0/0。 使用TCP协议,通过内网访问实例的端口。 4.8.0 5.x 入方向 TCP 8200 使用TCP协议,通过公网访问实例的端口。 4.8.0 5.x 入方向 TCP 10100-10199 使用TCP协议,访问业务节点的端口。 5.x 入方向 TCP 8080 使用gRPC协议,通过内网访问实例的端口。 5.x 入方向 TCP 8081 使用gRPC协议,通过公网访问实例的端口。 建议将访问DMS for RocketMQ实例方式设置为密码访问(即开启ACL访问控制),防止未经认证的客户端误操作实例。 您可以选择如下任意一种方法开启ACL访问控制。 在“购买实例”页面开启ACL访问控制,具体可参考购买RocketMQ实例。 购买实例后,在实例的“基本信息”页面中开启ACL访问控制,具体可参考查看和修改RocketMQ实例基本信息。 开启敏感操作多因子认证保护您的数据不被误删。 DMS for RocketMQ支持敏感操作保护,开启后执行删除实例等敏感操作时,系统会进行身份验证,进一步对数据的高危操作进行控制,保证DMS for RocketMQ数据的安全性。详情请参见敏感操作。
  • 审计是否存在异常数据访问 开启 云审计 服务,记录DMS for RocketMQ的所有访问操作,便于后期审查。 云审计服务(Cloud Trace Service, CTS ),是华为 云安全 解决方案中专业的日志审计服务,提供对各种云资源操作记录的收集、存储和查询功能,可用于支撑安全分析、合规审计、资源跟踪和问题定位等常见应用场景。 您开通云审计服务并创建和配置追踪器后,CTS可记录DMS for RocketMQ的管理事件和数据事件用于审计。相关文档请参见查看RocketMQ审计日志。 使用 云监控服务 对安全事件进行实时监控和告警。 为使您更好地掌握DMS for RocketMQ实例状态,华为云提供了 云监控 服务(Cloud Eye)。您可使用该服务监控自己的DMS for RocketMQ实例,执行自动实时监控、告警和通知操作,帮助您实时掌握DMS for RocketMQ实例中所产生的请求、流量等信息。 云监控服务不需要开通,会在用户创建DMS for RocketMQ实例后自动启动。相关文档请参见RocketMQ支持的监控指标、配置RocketMQ监控告警。
  • 实施方法 从上面的消费重复场景可以看到,不同Message ID的消息可能有相同的消息内容,因此Message ID无法作为消息的唯一标识符。RocketMQ可以为消息设置Key,把业务的唯一标识作为消息的唯一标识,从而实现消息的幂等。为消息设置Key的示例代码如下: Message message = new Message(); message.setKey("Order_id"); // 设置消息的Key,可以使用业务的唯一标识作为Key,例如订单号等。 SentResult sendResult = mqProducer.send(message); 生产者发送消息时,消息已经设置了唯一的Key,在消费者消费消息时,可以根据消息的Key进行幂等处理。消费者通过getKeys()能够读取到消息的唯一标识(如订单号等),业务逻辑围绕该唯一标识进行幂等处理即可。
  • 方案概述 在RocketMQ的业务处理过程中,如果消息重发了多次,消费者端对该重复消息消费多次与消费一次的结果是相同的,多次消费并没有对业务产生负面影响,那么这个消息处理过程是幂等的。消息幂等保证了无论消息被重复投递多少次,最终的处理结果都是一致的,避免了因消息重复而对业务产生影响。 例如在支付场景下,用户购买商品后进行支付,由于网络不稳定导致用户收到多次扣款请求,导致重复扣款。但实际上扣款业务只应进行一次,商家也只应产生一条订单流水。这时候使用消息幂等就可以避免这个问题。 在实际应用中,导致消息重复的原因有网络闪断、客户端故障等,且可能发生在消息生产阶段,也可能发生在消息消费阶段。因此,可以将消息重复的场景分为以下两类: 生产者发送消息时发生消息重复: 生产者发送消息时,消息成功发送至服务端。如果此时发生网络闪断,导致生产者未收到服务端的响应,此时生产者会认为消息发送失败,因此尝试重新发送消息至服务端。当消息重新发送成功后,在服务端中就会存在两条内容相同的消息,最终消费者会消费到两条内容一样的重复消息。 消费者消费消息时发生消息重复: 消费者消费消息时,服务端将消息投递至消费者并完成业务处理。如果此时发生网络闪断,导致服务端未收到消费者的响应,此时服务端会认为消息投递失败。为了保证消息至少被消费一次,服务端会尝试投递之前已被处理过的消息,最终消费者会消费到两条内容一样的重复消息。
  • 步骤二:创建RocketMQ实例 使用RocketMQ进行消息生产和消费时,必须先创建RocketMQ实例。实例中的虚拟机资源会存储Topic信息。 进入购买RocketMQ实例页面。 设置实例信息,配置详情请参考表2。 表2 设置实例信息 参数 参数说明 计费模式 选择实例的计费模式。此处选择“按需计费”,即按照实例的实际使用时长计费,秒级计费,按小时结算。 区域 选择靠近您客户的区域,可以降低网络时延、提高访问速度。此处选择“华北-北京四”。 项目 选择区域对应的项目。此处选择“华北-北京四”。 可用区 可用区指在同一区域下,电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离。此处选择“可用区1”。 实例名称 填写实例名称,此处配置为“rocketmq-test”。 企业项目 企业项目是对企业不同项目间资源的分组和管理,属于逻辑隔离。此处选择“default”。该参数针对企业用户使用。 规格选择模式 选择实例的规格设置模式,此处选择“默认”,即自定义RocketMQ实例的版本号、实例类型、部署架构、实例规格和存储空间。 版本 选择实例的版本。此处选择“4.8.0”。 RocketMQ实例创建后,版本号不支持修改。 部署架构 选择实例的部署架构。此处选择“集群”。 代理规格 选择实例相应的代理规格。此处选择“rocketmq.4u8g.cluster”。 代理数量 选择实例相应的代理数量。此处选择“1”。 代理存储空间 选择存储RocketMQ数据的磁盘类型和单个代理存储空间。选择“超高I/O 300GB”。实例总存储空间 = 单个代理的存储空间 * 代理数量 虚拟私有云 选择实例的VPC和子网。此处选择步骤一:准备工作中已创建的VPC和子网。 安全组 选择实例的安全组。此处选择步骤一:准备工作中已创建的安全组。 SSL 开启SSL,表示服务端与客户端之间通过密文传输,安全性较高,性能较低。此处选择开启SSL。 ACL访问控制 开启ACL访问控制可以对生产消息和消费消息进行权限管理。此处选择关闭ACL访问控制。 更多配置 公网访问 开启公网访问需要绑定弹性IP地址。此处选择关闭公网访问。 标签 标签是RocketMQ实例的标识。此处不设置标签。 描述 描述是对实例的补充说明。此处不填写描述信息。 图2 设置实例信息 填写完上述信息后,单击“立即购买”,进入规格确认页面。 确认实例信息无误后,勾选“协议”,并单击“提交”请求。 在实例列表页面,查看RocketMQ实例是否创建成功。 创建实例大约需要3到15分钟,此时实例的“状态”为“创建中”。 当实例的“状态”变为“运行中”时,说明实例创建成功。 当实例的“状态”变为“创建失败”,请删除创建失败的实例,然后重新创建。如果重新创建仍然失败,请联系客服。 实例创建成功后,单击实例名称,进入实例基本信息页面。 记录实例的连接地址,便于生产和消费消息时使用。 图3 记录实例连接地址
  • 相关信息 如果您想了解关于RocketMQ的相关概念,请参考RocketMQ基本概念。 RocketMQ实例创建时,如果消费者客户端与生产者客户端无需通过密文传输,那么您可以关闭SSL。此时连接RocketMQ实例生产和消费消息的操作请参见使用客户端连接RocketMQ(关闭SSL)。 如果您需要创建多个用户并为其赋予不同的Topic和消费组权限,以达到用户之间的权限隔离,那么您需要先开启ACL访问控制并配置ACL用户,具体操作请参考开启RocketMQ ACL访问和配置RocketMQ ACL用户。 如果您需要通过公网访问RocketMQ实例,请参见配置RocketMQ实例的公网访问。
  • 步骤四:连接RocketMQ实例生产和消费消息 在E CS 环境中进入“rocketmq-tutorial/bin”目录。 cd rocketmq-tutorial/bin 运行生产普通消息命令。 命令示例如下: JAVA_OPT=-Dtls.enable=true sh mqadmin sendMessage -n "10.xxx.xxx.89:8100;10.xxx.xxx.144:8100" -t Topic01 -p "hello rocketmq" 10.xxx.xxx.89:8100;10.xxx.xxx.144:8100:表示RocketMQ实例的“连接地址”,即7中记录的连接地址。 Topic01:表示RocketMQ实例下创建的Topic名称,即4中创建的Topic名称。 hello rocketmq:表示生产消息的内容。 运行消费普通消息命令。 命令示例如下: JAVA_OPT=-Dtls.enable=true sh mqadmin consumeMessage -n "10.xxx.xxx.89:8100;10.xxx.xxx.144:8100" -t Topic01 如上图中BODY显示的内容即为消费消息的内容。 如需停止消费使用Ctrl+C命令退出。
  • 步骤三:创建Topic Topic,即消息主题,消息发送与接收的基本单元。创建RocketMQ实例成功后,需要手动创建Topic,然后才能进行生产消息和消费消息。 单击RocketMQ实例的名称,进入实例基本信息页面。 在左侧导航栏,单击“Topic管理”,进入“Topic管理”页面。 单击“创建Topic”,弹出“创建Topic”页面。 参考表3,填写Topic名称和配置信息。 表3 Topic参数说明 参数 说明 Topic名称 填写Topic的名称。此处配置为“Topic01”。 权限 选择Topic的权限。此处选择“发布+订阅”,表示生产者可以发布消息到该Topic,消费者可以消费该Topic中的消息。 关联代理 选择Topic关联的代理。此处选择“代理”为“broker-0”,“队列个数”为“3”。 图4 创建Topic 配置完成后,单击“确定”,完成Topic的创建。
  • 操作流程 图1 RocketMQ使用流程 准备工作。 在创建RocketMQ实例前,您需要完成注册华为云并实名认证、为账户充值、为用户添加操作权限、创建VPC和子网、创建安全组、创建弹性云服务器并配置环境的准备工作。 创建RocketMQ实例。 在创建实例时,您需要开启SSL、关闭ACL,并配置已创建的VPC和子网、安全组。 创建Topic。 在实例创建成功后,您需要创建Topic,用于发送与接收消息。 连接RocketMQ实例生产和消费消息。 使用客户端连接实例,并通过命令行生产消费消息。
  • 消息清理机制 无论消息是否被消费,RocketMQ的消息默认保留时间为48小时,最长保留时间为720小时,修改保留时间的操作请参见修改RocketMQ消息保留时间。RocketMQ消息存储在CommitLog文件中,CommitLog文件大小为1GB,当一个CommitLog文件写满后,会生成一个新的CommitLog文件。RocketMQ删除消息是删除CommitLog文件,而不是删除一条消息。CommitLog文件为顺序写入,当最后写入的一条消息过期时,表示CommitLog文件过期。满足如下任意一个条件,CommitLog文件将会被清理: 每天凌晨4点会清理过期的文件,部分老实例由于未设置时区,清理时间为每天中午12点。 当磁盘使用率达到75%时,会立刻清理过期的文件。 当磁盘使用率达到85%时,会从最早创建的文件开始清理,不管文件是否已过期,直到磁盘空间充足。
  • 前提条件 已创建RocketMQ实例和Topic。 如果通过按Message ID查询,需要提前获取消息所在的Topic名称和消息的Message ID。 Message ID为生产消息后返回的MsgId,如6中返回的内容,也可先通过Topic查询消息,记录Message ID。 如果通过按Message Key查询,需要提前获取消息所在的Topic名称和消息的Message Key。 Message Key为7中配置的消息Key,也可先通过Topic查询消息,记录Message Key。
  • 在application.properties文件中填写配置 #=============== 生产者配置 ======================= ## 替换成真实RocketMQ的NameServer地址与端口 rocketmq.name-server=127.0.0.1:9876 rocketmq.producer.group=my-group #=============== 消费者配置 ======================= ## 替换成真实RocketMQ的NameServer地址与端口 rocketmq.name-server=127.0.0.1:9876
  • 生产消息 生产消息的示例代码如下(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 @SpringBootApplication public class ProduceDemoApplication implements CommandLineRunner { @Resource private RocketMQTemplate rocketMQTemplate; public static void main(String[] args) { SpringApplication.run(ProduceDemoApplication.class, args); } @Override public void run(String... args) throws Exception { // send message synchronously rocketMQTemplate.convertAndSend("topic", "Hello, World!"); // send spring message rocketMQTemplate.send( "topic", MessageBuilder.withPayload("Hello, World! I'm from spring message").build()); // send messgae asynchronously rocketMQTemplate.asyncSend( "topic", MessageBuilder.withPayload("Hello, World! I'm from spring message").build(), new SendCallback() { @Override public void onSuccess(SendResult var1) { System.out.printf("async onSucess SendResult=%s %n", var1); } @Override public void onException(Throwable var1) { System.out.printf("async onException Throwable=%s %n", var1); } }); // Send messages orderly rocketMQTemplate.syncSendOrderly( "topic", MessageBuilder.withPayload("Hello, World").build(), "hashkey"); } }
  • 注意事项 定时消息的最大延迟时间为1年,延迟超过1年的消息将会发送失败。 定时消息的定时时间如果被设置成当前时间戳之前的某个时刻,消息将立刻投递给消费者。 在理想情况下,定时消息设定的时间与实际发送时间的误差在0.1s以内。但在定时消息投递压力过大时,会触发定时消息投递流控机制,精度会变差。 在0.1s的精度内,不保证消息投递的顺序性。即如果两条定时消息的定时时间差距小于0.1s,他们投递的顺序与他们发送的顺序无法确保一致。 无法确保定时消息仅投递一次,定时消息可能会重复投递。 定时消息的定时时间是服务端开始向消费端投递的时间。如果消费者当前有消息堆积,那么定时消息会排在堆积消息后面,将不能严格按照配置的时间进行投递。 由于客户端和服务端可能存在时间差,消息的实际投递时间与客户端设置的投递时间之间可能存在偏差,以服务端时间为准。 设置定时消息的投递时间后,依然受消息老化时间限制,默认消息老化时间为2天。例如,设置定时消息5天后才能被消费,如果第5天后一直没被消费,那么这条消息将在第7天被删除。 定时消息将占用普通消息约3倍的存储空间,大量使用定时消息时需要注意存储空间占用。
  • 准备环境 执行以下命令,检查是否已安装Go。 go version 返回如下回显时,说明Go已经安装。 go version go1.16.5 linux/amd64 如果未安装Go,请下载并安装。 在“go.mod”中增加以下代码,添加依赖。 module rocketmq-example-go go 1.13 require ( github.com/apache/rocketmq-clients/golang/v5 )