
一、涉及知识点
1. 消息中间件概述
消息中间件(Message Middleware)是一种基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。消息中间件,也被称为消息队列。
利用高效可靠的异步消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。其最突出的特点是提供数据传输的可靠性和高效性,主要解决分布式的系统数据传输需求。
作用和应用场景:消息中间件在分布式系统中扮演着至关重要的角色,它的作用主要体现在以下几个方面:
异步通信:通过消息中间件,不同的服务之间可以进行异步通信,从而提高系统的吞吐量和并发性能,避免因为同步调用而导致的阻塞和性能瓶颈。
应用解耦:消息中间件可以将消息发送方和接收方解耦,使得它们可以独立地进行开发和部署,不需要直接依赖于对方的实现细节。
流量控制:消息中间件可以设置流量控制,当消息流量过大时,可以暂停消息的发送,等到流量下降时再继续发送,从而平滑地处理流量峰值。
日志处理:消息中间件需要对关键信息进行日志记录和处理,以便于监控和追踪系统运行情况,发现潜在问题,优化系统性能。
2. TongLinkQ消息中间件概述
TongLinkQ 是面向分布式应用的消息中间件产品,主要功能是在应用程序之间进行实时、高效和可靠的传递消息,使得消息在不同的网络协议不同的计算机系统和不同的应用软件之间进行网络传输。TongLinkQ应用程序可灵活地运行在多平台的多节点上。
当应用程序之间要传送消息时,应用程序只需将消息目的地、消息的属性和内容以及消息的控制信息通过API接口传递给TongLinkQ,TongLinkQ根据应用提供的信息对消息进行处理,并且利用TongLinkQ的节点组成的虚拟网,将消息传送到消息接收者所在节点上,最后提交给消息的接收者。
TongLINK/Q的平台无关性(平台无关性指的是软件或程序能够在不同的操作系统或硬件平台上运行,而无需进行适配。)
支持开发语言:C/C++/C#,JAVA,JMS
支持协议:支持 TCP/IP 协议,支持SSL安全传输协议
支持多种网络底层环境:租用线 (Leased line)、拨号线、分组交换网(X..25)、DDN , 帧中继 (Frame Relay) 、卫星网络等(以太网,广域网,拨号上网,DDB专线卫星网)
支持多运行平台:Windows系列、Linux系列、AIX系列、Solaris系列(支持国产Linux操作系统和飞腾芯片)
3. 消息
3.1 消息指的是在应用进程之间或一个应用内部交换的数据单元,TLQ的消息分为三部分:
消息描述:消息描述给出消息的特定属性,包含消息类型、长度、优先级等
自定义属性:提供给用户,用以对消息进行更详细的描述。
应用数据:应用程序数据的内容和结构由用户的用户程序来定义,格式内容不限制,但是字符编码需要提前协商
3.2 按照构成消息的数据类型,可以分为三种:
BUFFER消息:应用数据为内存中的一段数据
FILE消息:应用数据为文件名(文件不能重名)
EVENT消息:TLQ事件功能产生的消息
3.3 消息由三部分组成:消息描述(必需)+用户自定义属性(可选)+消息内容

4. 消息常用属性
消息类型:BUF消息、FILE消息、EVENT消息、死信消息
持久性:持久消息存储在磁盘,非持久消息存储在内存
优先级:TLQ支持的优先分别为 0-9
优先级9:独占优先级,当队列中有优先级为9的消息时,其它消息没有消息发送
优先级0:等待优先级,当队列中有优先级大于0的消息存在,优先级为0的消息没有机会发送,只能等待其它优先级的消息发送完毕后,才能发送
优先级8-1:相同机会发送,发送速度由快到慢
生命周期:消息的生命周期是消息所具有的属性之一,用于控制一个消息从开始发送到最终被用户接收所允许的最长时间。当消息超过声明周期,核心将自动丢弃消息,消息的生命周期为秒。
5. 节点
节点是一套完整的TLQ运行环境(实例)的集合。对TLQ系统的监控和管理是以节点为单位。TLQ节点分为服务端和客户端两种类型。
TLQ服务端节点:服务端中包含运行的TLQ系统核心进程、系统内存资源、日志系统、数据存储和应用进程。
TLQ客户端:客户端可与服务端安装在同一台机器上,也可以安装在不同的机器上。客户端应用程序调用客户端以动态库或jar包形式提供的API,通过网络的方式,与一个或多个正在运行的TLQ服务端进行交互。系统的监控和管理是以节点为单位的。
6. 队列控制单元
队列控制单元(Queue Control Unit,简称QCU)。QCU(服务端)节点内相对独立的运行单元。功能主要是隶属于本QCU的队列以及队列内的消息进行监控和管理。QCU是队列和消息的管理单元,运行中的QCU会创建数据缓存区(发送/接收缓存区)、队列,以及一组工作进程。此外QCU还包括运行时需要使用的目录、配置文件和环境变量。
队列控制单元与节点的关系
一个服务端节点内可以包含多个队列控制单元,各个队列控制单元各自独立工作,互不相干。
队列控制单元与进程的关系
一个QCU可对应多个发送进程和接收进程
一个节点配置的QCU个数是由License决定
一个应用进程同时打开的QCU不能超过32个
7. TongLinkQ安装包介绍
Window版本介绍
64位服务端安装包:Install_TLQ8_1_15_1_Windows_64.exe
32位服务端安装包:Install_TLQ8_1_15_1_Windows_32.exe
64位客户端安装包:Install_TLQCli8_1_15_1_Windows_64.exe
32位客户端安装包:Install_TLQCli8_1_15_1_Windows_32.exe
UNIX版本介绍
常见Linux安装包
服务端:Install_TLQ_Standard_Linux2.6.18_i686_8.1.15.1.tar.gz
客户端:Install_TLQCli_Standard_Linux2.6.18_i686_8.1.15.1.tar.gz
Intel x86架构
服务端:Install_TLQ_Standard_Linux2.6.18_x86_64_8.1.15.1.tar.gz
客户端:Install_TLQCli_Standard_Linux2.6.18_x86_64_8.1.15.1.tar.gz
申威版
服务端:Install_TLQCli_Standard_Linux3.10.0_sw_64_8.1.15.1.tar.gz
ARM 飞腾
服务端:Install_TLQ_Standard_Linux4.4.58_aarch64_8.1.15.1.tar.gz
客户端:Install_TLQCli_Standard_Linux4.14.0_aarch64_8.1.15.1.tar.gz
龙芯
服务端:Install_TLQ_Standard_Linux3.10.0_mips64el_8.1.15.1.tar.gz
二、任务实施
1. TongLinkQ服务端的安装
节点设置
1.1 安装前系统检查:检查信号灯和共享内存
[Step1] 筛选出所有与共享内存相关的系统配置参数
[root@host99 ~]# sysctl -a | grep shm
[Step2] 筛选出所有与信号量相关的系统配置参数
[root@host99 ~]# sysctl -a | grep sem
[Step3] 文件打开数检查
[root@host99 ~]# ulimit -a
1.2 安装TongLinkQ
[Step1] 上传安装包与许可证到任意目录下

[Step2] 安装java-1.8.0-openjdk
[root@host99 ~]# dnf install -y java-1.8.0-openjdk[Step3] 验证:查看jdk的版本信息
[root@host99 ~]# java -version
[Step4] 解压压缩包到指定目录,然后将许可证移动到解压目录内
[root@host99 ~]# tar zxf Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.17.1.tar.gz -C /opt
[root@host99 ~]# cp license.dat /opt/TLQ8/
[Step5] 修改环境变量,将TLQ8目录下setp文件内容追加到全局的环境变量文件或用户的环境变量文件中
[root@host99 ~]# cat /opt/TLQ8/setp >> /etc/profile[Step6] 编辑刚刚修改的环境变量文件,将TLQHOMEDIR替换为TLQ8的安装目录
[root@host99 ~]# vim /etc/profile
# 修改下列内容
TLQHOMEDIR=/opt/TLQ8[Step7] 重新加载系统环境变量文件
[root@host99 ~]# source /etc/profile[Step8] 验证:查看jdk的版本信息
[root@host100 ~]# java -version
1.3 TongLinkQ的启停
启动顺序:先启动TLQ,再启动应用程序;停止顺序:先停止应用程序,再停止TLQ。
[Step1] 启动TLQ
[root@host99 ~]# tlq
[Step2] Project Name出现乱码是因为SSH终端编码问题,可以更改编码或更换SSH终端

[Step3] 成功启动后查看系统进程
[root@host99 ~]# ps -ef | grep tl_
2. TongLinkQ客户端的安装
[Step1] 上传客户端安装包,客户端不需要许可证

[Step2] 解压缩安装包,客户端不需要授权也不需要启动
[root@host100 ~]# tar zxf Install_TLQCli_Standard_Linux2.6.32_x86_64_8.1.17.1.tar.gz -C /opt
[Step3] 修改环境变量,将TLQCli8目录下setp文件内容追加到全局的环境变量文件或用户的环境变量文件中
[root@host100 ~]# cat /opt/TLQCli8/setp >> /etc/profile[Step5] 编辑刚刚修改的环境变量文件,将TLQHOMEDIR替换为TLQ8的安装目录
[root@host100 ~]# vim /etc/profile
# 修改下列内容
TCLIHOMEDIR=/opt/TLQCli8[Step6] 重新加载系统环境变量文件
[root@host100 ~]# source /etc/profile[Step7] 查看环境变量
[root@host100 ~]# env|grep TCL
[Step8] 安装java-1.8.0-openjdk和openjdk开发工具包
[root@host100 ~]# dnf install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel3. TongLinkQ客户端与服务端的通信
3.1 服务端配置
[Step1] 在服务端上编tlqcu_qcu1.conf辑配置文件
[root@host99 ~]# vim /opt/TLQ8/etc/tlqcu_qcu1.conf
# 修改下列参数
[SendConnRecord] # 发送连接下节
HostName = 192.37.26.99 # 被连接节点的IP地址,修改为本机IP地址
[ClientBroker] # 瘦客户代理小节
ListenPort = 10261 # 代理监听的端口号,端口号需大于1024。需要和客户端的端口一致[Step2] 重新启动TLQ
[root@host99 ~]# tlq -cstop -y
[root@host99 ~]# tlq
3.2 客户端配置
[Step1] 在客户端上编辑tlqcli.conf配置文件,添加服务端的相关参数
[root@host100 ~]# vim /opt/TLQCli8/etc/tlqcli.conf
# 修改下列内容
HostName = 192.37.26.99 # 代理所在的机器名或IP,修改为服务端IP地址
ListenPort = 10261 # 代理的监听端口号,需要和服务端的端口一致[Step2] 在服务端查看qcu1队列控制单元的消息数,可以看到为空且连接状态为close
[root@host99 ~]# tlqstat -qcu qcu1 -c
[Step3] 使用客户端向服务端发送消息,因为发送消息需要使用java程序,需要确保JDK的配置无误
[root@host100 ~]# cd /opt/TLQCli8/samples/demo_java/base
[root@host100 base]# javac *.java[Step4] 验证:此时目录下会出现一堆Java编译后的字节码文件
[root@host100 base]# ll | grep class
3.3 客户端向服务端发送信息
[Step1] 调用编译程序向服务端发送信息
[root@host100 base]# java SendMsgCli qcu1 lq B noqcu1:服务端控制单元名称
lq:服务端队列名称,lq代表本地队列;rq代表远程队列
lq 将消息发到本地服务器
rq将消息发到目标服务器
B:消息类型。(B代表Buf消息输入;F代表file类型输入)
no:要发送的文件名,Buf类型不需要输入文件名

[Step2] 成功发送消息后,到服务端查看qcu1队列控制单元的消息数,可以看到lq接收到两条消息
[root@host99 ~]# tlqstat -qcu qcu1 -c
[Step3] 查询发送的两条消息
[root@host100 base]# java GetMsgCli qcu1 lq 0
[Step4] 查询完消息后,重新去服务端查看qcu1队列控制单元的消息数,可以看到数值已经变为0
[root@host99 ~]# tlqstat -qcu qcu1 -c
4. TongLinkQ的点对点模式
点对点模式的配置关键就是收发端口需要和对端匹配

4.1 服务端配置
[Step1] 在服务端上编辑tlqcu_qcu1.conf配置文件
[root@host99 ~]# vim /opt/TLQ8/etc/tlqcu_qcu1.conf
# 修改下列内容
[SendConnRecord] # 发送连接小节
HostName = 192.37.26.100 # 被连接节点的IP地址,修改为对端IP地址
ConnPort = 10004 # 被连接节点的端口号,端口号需大于1024
[RcvProcessRecord]
ListenPort = 10003 # 监听端口,端口号需大于1024,该端口应该为对端的发送端口[Step2] 重启TLQ服务
[root@host99 ~]# tlq -cstop -y
[root@host99 ~]# tlq
4.2 客户端配置
[Step1] 安装服务端软件
[root@host100 ~]# tar zxf Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.17.1.tar.gz -C /opt
[root@host100 ~]# cp license.dat /opt/TLQ8/
[root@host100 ~]# sed -i 's/\$PWD/\/opt\/TLQ8/g' /opt/TLQ8/setp
[root@host100 ~]# cat /opt/TLQ8/setp >> /etc/profile
[root@host100 ~]# source /etc/profile[Step2] 验证:过滤环境变量
[root@host100 ~]# env|grep TLQHOMEDIR
[Step3] 在客户端上编辑tlqcu_qcu1.conf配置文件
[root@host100 ~]# vim /opt/TLQ8/etc/tlqcu_qcu1.conf
# 修改下列内容
[SendConnRecord] # 发送连接小节
HostName = 192.37.26.99 # 被连接节点的IP地址,修改为对端IP地址
ConnPort = 10003 # 被连接节点的端口号,端口号需大于1024
[RcvProcessRecord]
ListenPort = 10004 # 监听端口,端口号需大于1024,该端口应该为对端的发送端口[Step3] 启动TLQ服务
[root@host100 ~]# tlq
4.3 点对点效果验证
[Step1] 在服务端上查看qcu1队列控制单元的消息数,可以看到ConnStatus状态均为link
[root@host99 ~]# tlqstat -qcu qcu1 -c
[Step2] 在客户端上查看qcu1队列控制单元的消息数,可以看到ConnStatus状态均为link
[root@host100 ~]# tlqstat -qcu qcu1 -c