RocketMQ: 集群部署注意事项

概述

  • RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:
    • 能够保证严格的消息顺序
    • 提供丰富的消息拉取模式
    • 高效的订阅者水平扩展能力
    • 实时的消息订阅机制
    • 亿级消息堆积能力
  • 选用理由:
    • 强调集群无单点,可扩展,任意一点高可用,水平可扩展。
    • 海量消息堆积能力,消息堆积后,写入低延迟。
    • 支持上万个队列
    • 消息失败重试机制
    • 消息可查询
    • 开源社区活跃
    • 成熟度(经过双十一考验)

关键概念


1 ) 主题与标签
  • 主题 Tpoic:第一级消息类型,书的标题
  • 标签 Tags:第二级消息类型,书的目录,可以基于 Tag 做消息过滤

例如:

  • 主题:
    • 订单交易
  • 标签:
    • 订单交易-创建
    • 订单交易-付款
    • 订单交易-完成
  • 可见,标签用于细分主题

2 )发送与订阅群组

  • 生产组:用于消息的发送
  • 消费组:用于消息的订阅处理

  • 生产组和消费组,方便扩缩机器,增减处理能力,集群组的名字,用于标记用途中的一员
  • 每次只会随机的发给每个集群中的一员

RocketMQ 集群方式

  • 推荐的几种 Broker 集群部署方式,这里的 Slave 不可写,但可读,类似于 Mysql 主备方式

1 ) 单个 Master

  • 这种方式风险较大,一旦 Broker 重启或者宕机时,会导致整个服务不可用,不建议线上环境使用

2 ) 多 Master 模式

  • 一个集群无 Slave,全是 Master,例如 2 个 Master 或者 3 个 Master
  • 优点
    • 配置简单,单个 Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10时
    • 即使机器宕机不可恢复情况下,由与 RAID10 磁盘非常可靠
    • 消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢), 性能最高
  • 缺点
    • 单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅
    • 消息实时性会受到受到影响

  • 启动集群
    • 先启动 NameServer
    • 在机器 A,启动第一个 Master
    • 在机器 B,启动第二个 Master

多 Master 多 Slave 模式,异步复制

  • 每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用异步复制方式,主备有短暂消息延迟,毫秒级
  • 优点
    • 即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响
    • 因为 Master 宕机后,消费者仍然可以从 Slave 消费,此过程对应用透明
    • 不需要人工干预,性能同多Master 模式几乎一样
  • 缺点
    • Master 宕机,磁盘损坏情况,会丢失少量消息

  • 启动集群
    • 先启动 NameServer
    • 在机器 A,启动第一个 Master
    • 在机器 B,启动第二个 Master
    • 在机器 C,启动第一个 Slave
    • 在机器 D,启动第二个 Slave

多 Master 多 Slave 模式,同步双写

  • 每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用同步双写方式,主备都写
    成功,向应用返回成功。
  • 优点
    • 数据与服务都无单点,Master 宕机情况下,消息无延迟
    • 服务可用性与数据可用性都非常高
  • 缺点
    • 性能比异步复制模式略低,大约低 10%左右,发送单个消息的 RT 会略高
    • 目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能

  • 启动集群
    • 先启动 NameServer
    • 在机器 A,启动第一个 Master
    • 在机器 B,启动第二个 Master
    • 在机器 C,启动第一个 Slave
    • 在机器 D,启动第二个 Slave
  • 以上 Broker 与 Slave 配对是通过指定相同的 brokerName 参数来配对,Master 的 BrokerId 必须是 0,Slave 的 BrokerId 必须是大与 0 的数
  • 另外一个 Master 下面可以挂载多个 Slave,同一 Master 下的多个 Slave 通过指定不同的 BrokerId 来区分

RocketMQ 部署【Master-Slave 方式】


1 )服务器环境

序号IP用户名密码角色模式
1192.168.11.128root***nameServer1,brokerServer1Master1
2192.168.11.129root***nameServer2,brokerServer2Master2

2 ) Hosts 添加信息

vi /etc/hosts

IPNAME
192.168.11.128rocketmq-nameserver1
192.168.11.128rocketmq-master1
192.168.11.129rocketmq-nameserver2
192.168.11.129rocketmq-master1-slave

3 ) 上传解压【两台机器】

# 上传 apache-rocketmq.tar.gz 文件至/usr/local
# tar -zxvf apache-rocketmq.tar.gz -C /usr/local
# ln -s apache-rocketmq rocketmq 建立软链ll /usr/local

4 )创建存储路径【两台机器】

# mkdir /usr/local/rocketmq/store
# mkdir /usr/local/rocketmq/store/commitlog
# mkdir /usr/local/rocketmq/store/consumequeue
# mkdir /usr/local/rocketmq/store/index

5 ) RocketMQ 配置文件【两台机器】

  • vim /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties
  • vim /usr/local/rocketmq/conf/2m-2s-async /broker-a-s.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker 名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a|broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer 地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制 Master
#- SYNC_MASTER 同步双写 Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

6 ) 修改日志配置文件【两台机器】

# mkdir -p /usr/local/rocketmq/logs
# cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml

7 ) 修改启动脚本参数【两台机器】

  • vim /usr/local/rocketmq/bin/runbroker.sh

    #==============================================================================
    # 开发环境 JVM Configuration
    #==============================================================================
    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -
    XX:MaxPermSize=320m"
    
  • vim /usr/local/rocketmq/bin/runserver.sh

    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -
    XX:MaxPermSize=320m"
    

8 ) 启动 NameServer【两台机器】

# cd /usr/local/rocketmq/bin
# nohup sh mqnamesrv &

9 ) 启动 BrokerServer A【192.168.11.128】

# cd /usr/local/rocketmq/bin
# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &
# netstat -ntlp
# jps
# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log

10 ) 启动 BrokerServer B【192.168.11.129】

# cd /usr/local/rocketmq/bin
# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-noslave/broker-a-s.properties >/dev/null 2>&1 &
# netstat -ntlp
# jps
# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log

11 ) RocketMQ Console

在 tomcat 中部署 rocketmq-console.war

12 ) 数据清理

# cd /usr/local/rocketmq/bin
# sh mqshutdown broker
# sh mqshutdown namesrv
# --等待停止
# rm -rf /usr/local/rocketmq/store
# mkdir /usr/local/rocketmq/store
# mkdir /usr/local/rocketmq/store/commitlog
# mkdir /usr/local/rocketmq/store/consumequeue
# mkdir /usr/local/rocketmq/store/index
# --按照上面步骤重启 NameServer 与 BrokerServer

使用注意事项


1 ) 消费重试机制

第几次重试每次重试间隔时间
110 秒
230 秒
31 分钟
42 分钟
53 分钟
64 分钟
75 分钟
86 分钟
97 分钟
108 分钟
119 分钟
1210 分钟
1320 分钟
1430 分钟
151 小时
162 小时

2 )消费端做幂等处理

  • RocketMQ 无法避免消息重复,如果业务对消费重复非常敏感,务必要在业务局面去重,
  • 有以下几种去重方式:
    • 将消息的唯一键,可以是 msgId
    • 也可以是消息内容中的唯一标识字段,例如订单 Id等
    • 建议最好使用消息内容中的唯一标识字段去重

多主多从模式

  • 多主多从模式分为俩种方式,第一种为异步复制,第二种为同步双写

    • 我们暂且考虑其中的一种情况
  • 注意:RocketMQ 每一种集群环境配置会对应一个不同的目录

    • 双主模式,文件夹配置为: conf/2m-noslave/
    • 多主多从模式(异步复制),文件夹配置为: conf/2m-2s-async/
    • 多主多从模式(同步双写),文件夹配置为: conf/2m-2s-sync/
  • 集群规划如下:【四台机器】

    IPNAME
    192.168.11.121rocketmq-nameserver1、rocketmq-master1
    192.168.11.122rocketmq-nameserver2、rocketmq-master2
    192.168.11.123rocketmq-nameserver3、rocketmq-master1-slave
    192.168.11.124rocketmq-nameserver4、rocketmq-master2-slave
  • 添加 hosts 信息 vi /etc/hosts,参考如上

  • 解压上传【113、114 俩台机器】

    # 上传 alibaba-rocketmq-3.2.6.tar.gz 文件至/usr/local
    # tar -zxvf alibaba-rocketmq-3.2.6.tar.gz -C /usr/local
    # mv alibaba-rocketmq alibaba-rocketmq-3.2.6
    # ln -s alibaba-rocketmq-3.2.6 rocketmqll /usr/local
    
  • 创建存储目录【113、114 俩台机器】

    # mkdir /usr/local/rocketmq/store
    # mkdir /usr/local/rocketmq/store/commitlog
    # mkdir /usr/local/rocketmq/store/consumequeue
    # mkdir /usr/local/rocketmq/store/index
    
  • RocketMQ 配置文件【四台机器】

    # vim /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties
    # vim /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties
    # vim /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties
    # vim /usr/local/rocketmq/conf/2m-2s-async/broker-b-s.properties
    

broker-a.properties、broker-b.properties 配置如下:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker 名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a|broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer 地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmqnameserver3:9876;rocketmq-nameserver4:9876
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口listenPort=10911
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制 Master
#- SYNC_MASTER 同步双写 Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

broker-a-s.properties、broker-b-s.properties 配置如下:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker 名字,注意此处不同的配置文件填写的不一样,与 Master 通过 brokerName 来配对
brokerName=broker-a|broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer 地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876;rocketmqnameserver3:9876;rocketmq-nameserver4:9876
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制 Master
#- SYNC_MASTER 同步双写 Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
  • 修改日志配置文件【113、114 俩台机器】

    # mkdir -p /usr/local/rocketmq/logs
    # cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
    
  • 修改脚本启动参数【113、114 俩台机器】

    • vim /usr/local/rocketmq/bin/runbroker.sh

      #==============================================================================
      # 开发环境 JVM Configuration
      #==============================================================================
      JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
      
    • vim /usr/local/rocketmq/bin/runserver.sh

      JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -
      XX:MaxPermSize=320m"
      
  • 启动 NameServer【四台机器】

    # cd /usr/local/rocketmq/bin
    # nohup sh mqnamesrv &
    
  • 启动 Master1:BrokerServerA【192.168.11.121】

    # cd /usr/local/rocketmq/bin
    # nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties >/dev/null 2>&1 &
    # netstat -ntlp
    # jps
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
  • 启动 Master2:BrokerServerB【192.168.11.122】

    # cd /usr/local/rocketmq/bin
    # nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties >/dev/null 2>&1 &
    # netstat -ntlp
    # jps
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
  • 启动 Master1-Slave:BrokerServerC【192.168.11.123】

    # cd /usr/local/rocketmq/bin
    # nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties >/dev/null 2>&1 &
    # netstat -ntlp
    # jps
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
  • 启动 Master2-Slave:BrokerServerD【192.168.11.124】

    # cd /usr/local/rocketmq/bin
    # nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b-s.properties >/dev/null 2>&1 &
    # netstat -ntlp
    # jps
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log
    # tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
    
  • 服务停止(首先关闭 4 个 BrokerServer,再关闭 4 个 NameServer):

    # cd /usr/local/rocketmq/bin
    # sh mqshutdown broker
    # sh mqshutdown namesrv
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476499.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity How】Unity中如何实现物体的匀速往返移动

直接上代码 using UnityEngine;public class CubeBouncePingPong : MonoBehaviour {[Header("移动参数")][Tooltip("移动速度")]public float moveSpeed 2f; // 控制移动的速度[Tooltip("最大移动距离")]public float maxDistance 5f; // 最大…

ECharts柱状图-带圆角的堆积柱状图,附视频讲解与代码下载

引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…

element-plus的组件数据配置化封装 - table

目录 一、封装的table、table-column组件以及相关ts类型的定义 1、ATable组件的封装 - index.ts 2、ATableColumn组件的封装 - ATableColumn.ts 3、ATable、ATableColumn类型 - interface.ts 二、ATable、ATableColumn组件的使用 三、相关属性、方法的使用以及相关说明 1. C…

《数字图像处理基础》学习06-图像几何变换之最邻近插值法缩小图像

目录 一,概念 二,题目 三,matlab实现 对图像进行几何变换时,都是对数字图像进行处理。由于在matlab中使用imread函数读取的图像通常已经是数字图像,因此不需要进行额外的采样和量化等操作,就可以将图像…

TabNet 模型示例

代码功能 加载数据:从 UCI Adult Census 数据集中读取样本,进行清洗和编码。 特征处理:对分类特征进行标签编码,对数值特征进行标准化。 模型训练:使用 TabNet 模型对数据进行分类训练,采用早停机制提高效…

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

引言 之前写了 Requests 自动重试的文章,突然想到,之前还用到过 Requests 自动加解密请求的逻辑,分享一下。之前在做逆向的时候,发现一般医院的小程序请求会这么玩,请求数据可能加密也可能不加密,但是返回…

锂电池学习笔记(一) 初识锂电池

前言 锂电池近几年一直都是很热门的产品,充放电管理更是学问蛮多,工作生活中难免会碰到,所以说学习锂电池是工程师的必备知识储备,今天学习锂电池的基本知识,分类,优缺点,循序渐进 学习参考 【…

《Vue零基础入门教程》第四课: 应用实例

往期内容 《Vue零基础入门教程》第一课:Vue简介 《Vue零基础入门教程》第二课:搭建开发环境 《Vue零基础入门教程》第三课:起步案例 参考官方文档 https://cn.vuejs.org/api/application#create-app 示例 const {createApp} Vue// 通…

介绍一下strncmp(c基础)

strncmp是strcmp的进阶版 链接介绍一下strcmp(c基础)-CSDN博客 作用 比较两个字符串的前n位 格式 #include <string.h> strncmp (arr1,arr2,n); 工作原理&#xff1a;strcmp函数按照ACII&#xff08;字符编码顺序&#xff09;比较两个字符串。它从两个字符串的第一…

Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码

前言 本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01 接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码 如何在指定范围内查询。从lucene 7 开始&#xff0c;filter 被弃用&#xff0c;导致无法进行调节过滤。 TermInSetQuery 指定…

【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)

时钟源和主时钟&#xff08;SYSCLKOUT&#xff09; 外部晶振&#xff1a;通常使用外部晶振&#xff08;如 20 MHz&#xff09;作为主要时钟源。内部振荡器&#xff1a;还可以选择内部振荡器&#xff08;INTOSC1 和 INTOSC2&#xff09;&#xff0c;适合无需高精度外部时钟的应…

java 并发编程 (1)java中如何实现并发编程

目录 1. 继承 Thread 类 2. 实现 Runnable 接口 3. 使用 FutureTask 4. 使用 Executor 框架 5. 具体案例 1. 继承 Thread 类 概述&#xff1a;通过继承 Thread 类并重写其 run() 方法来创建一个新的线程。 步骤&#xff1a; 创建一个继承 Thread 类的子类。重…

巧用观测云可用性监测(云拨测)

前言 做为系统运维或者开发&#xff0c;很多时候我们需要能够实时感知我们所运维的系统和服务的情况&#xff0c;比如以下的场景&#xff1a; 系统上线前测试&#xff1a;包括功能完整性检查&#xff0c;确保页面元素&#xff08;如图像、视频、脚本等&#xff09;都能够正常…

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required&#xff1a; Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录&#xff0c;也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录&#xff0c;算一次会话…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

Win11 22H2/23H2系统11月可选更新KB5046732发布!

系统之家11月22日报道&#xff0c;微软针对Win11 22H2/23H2版本推送了2024年11月最新可选更新补丁KB5046732&#xff0c;更新后&#xff0c;系统版本号升至22621.4541和22631.4541。本次更新后系统托盘能够显示缩短的日期和时间&#xff0c;文件资源管理器窗口很小时搜索框被切…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

【赵渝强老师】MySQL的慢查询日志

MySQL的慢查询日志可以把超过参数long_query_time时间的所有SQL语句记录进来&#xff0c;帮助DBA人员优化所有有问题的SQL语句。通过mysqldumpslow工具可以查看慢查询日志。 视频讲解如下&#xff1a; MySQL的慢查询日志 【赵渝强老师】MySQL的慢查询日志 下面通过具体的演示…

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等&#xff0c;使用docker发布的优势有以下几点&#xff1a; 易于维护。直接docker命令进行管理&#xff0c;如docker stop、docker start等&#xff0c;快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…

Android 分区相关介绍

目录 一、MTK平台 1、MTK平台分区表配置 2、MTK平台刷机配置表 3、MTK平台分区表配置不生效 4、Super分区的研究 1&#xff09;Super partition layout 2&#xff09;Block device table 二、高通平台 三、展锐平台 四、相关案例 1、Super分区不够导致编译报错 经验…