常见问题
# 概念相关
# 是否支持国产数据库
支持。ADMQ支持mysql、sqlite、herddb、postgresql、达梦、人大金仓等数据库。
# 是否支持通过其他消息中间件的客户端发送消息
目前支持通过Kafka协议、MQTT协议、JMS协议和AMQP协议的客户端发送消息,对应的消息中间件有RabbitMQ、Kafka。
对于使用其他消息中间件的客户端,ADMQ并不支持该客户端的全部功能,只包含收发消息等基本功能。
# 是否有权限管理功能
权限包含两类
- 管控台权限:管理员可以管理集群和资源(包括:租户、命名空间、主题),并且可以分配资源权限给用户。
- 消息收发权限:生产者和消费者连接到ADMQ时需要携带token,token会控制消费者是否有主题的消息发送和消息读取权限。
# 消费者的四种订阅模式区别
独占模式(Exclusive)
只能有一个消费者读取消息,后续的消费者不能获取到消息,而且会报错(如开成功开启一个独家接收后,再开一个客户端时会提示错误,直接断开,无法连接)。
灾备模式(Failover)
有且仅有一个消费者在消费消息。和独有模式的区别是,这种模式下消费者会保持和broker之间的连接,一旦正在消费的消费者和broker的连接挂了,则可以任意选择一个正常的消费者消费消息(如开成功开启一个主备模式接收后,可以再看一个客户端处于连接中,但是无法接收消息,只有第一个客户端挂了后,这个客户端才能正常接收消息)。
独占和灾备模式的区别是,独占情况下只能有一个客户端能连到admq,第二个会直接退出。灾备模式是可以有多个客户端连接到admq,但是只能有一个发送消息,最先连接上的那个发送。
共享模式(Shared)
每个连接的消费者获取一部分数据。如果其中一个消费者挂了,则之前发送给这个消费者的且没有得到确认的消息会重新发送给其他消费者。 该模式就是平均发送给每一个消费者。但是有一种可能是不平均的,就是有的消费者处理的慢,那它收到的消息就比其他的少。
主键负载均衡(key_shared)
按照key做hash,每一个key的消息只能被唯一的一个消费者接收。
这种模式下,不能保证每个消费者都能收到消息。
# 消息持久化和非持久化区别
在topic中指定协议,persistent表示持久化,non-persistent表示非持久话,非持久化的消息不会被存储,发完就没有了,不能读取历史消息,持久化消息则可以存储起来,对于那些已经被消费者读取并确认的消息,能够再次读取,用于系统问题分析等场景。
# 死信队列
正常主题的消息发送到消费者,消费者处理失败的消息会自动转到死信队列里,然后消费者就可以从死信队列里收到那些处理失败的消息。
# 批量消息发送
支持批量消息和消息压缩,当消息大小(batch_bytes)、 数量(batch_messages)、 时间(batch_delay),满足任意一个后 才会发送消息。
# 消息加密
消息在生产者和消费者之间的传输过程中需要加密,采用AES加密算法。生产者和消费者保留私钥,ADMQ不解析消息内容,只提供转发功能。
但是对于同一个主题不能加密和不加密混合使用,如:对主题Topictest先发过加密的消息。后面再发送不加密的消息,接收时就会提示错误。
# 消息保留策略
支持设置未确认的消息多长时间后被标记已确认,已确认的消息多长时间后被删除。 在对应的命名空间中设置清理策略,TTL和保留时间和大小。
# 支持发送哪些类型的消息
目前支持byte数组、string、json、avro格式的消息。
# 租户、命名空间、主题、用户的作用和说明
租户、命名空间、主题 ADMQ是发布订阅模型,生产者发送的每一条消息都需要指定一个主题,消费者订阅的时候也需要告诉admq接收哪一个或者那几个主题的消息。 租户、命名空间和主题都是为了隔离数据的,一个租户下面可以有很多命名空间,一个命名空间下可以有很多主题。
用户 用户是权限判断用的。生产者接收消息和消费者订阅消息都需要携带用户信息(每个用户对应一个唯一的token),ADMQ会根据用户信息判断生产者是不是能往一个主题发送消息,消费者能不能订阅一个主题的消息。
# 消息查询
ADMQ会记录消息生产、存储和消费状态,方便用户排查消息发送和接收情况。
默认不会开启消息轨迹功能,需要在“资源管理”-“命名空间”-“更多”中手动开启轨迹,不开启轨迹只能查询消息生产情况和消息内容,不能查到消息消费情况。
以下情况查不到信息:
- 客户端使用系统提供的AES加密发送消息。
- 客户端批量发送,同时开启了逐条确认功能。
- 客户端采用累积确认。
# 部署相关
ADMQ支持单节点和集群两种部署方式,单节点部署时只提供部分简单功能,用于验证消息的接收和发送是否正常,集群部署提供完整的功能。
集群部署时至少需要3台服务器,需要分别部署计算组件、协调器和存储组件。
# 单机启动失败
单机程序启动后不能直接kill进程,需要在管控台-集群管理-节点中点击“停止”,或者在部署服务器上执行bin/admq-daemon stop standalone。
# 节点启动失败
首先查看管控台是否有错误日志,确认添加服务器时使用的用户是否有部署目录的读写和执行权限。
然后登录启动失败的节点服务器,手动启动节点,查看是否有错误日志,启动命令如下:
- 计算节点:bin/admq broker
- 存储节点:bin/admq storage
- 协调器:bin/admq zookeeper
如出现“VM option 'UseG1GC' is experimental and must be enabled via --XX:+UnlockExperimentalVMOptions”,则修改config/broker_env.sh和config/storage_env.sh,在UseG1GC前添加参数:--XX:+UnlockExperimentalVMOptions。
# 没有java执行权限
解压安装包,修改bin/admq文件,添加命令:
export JAVA_HOME=有权限的jdk目录
重新压缩安装包,上传到管控台上进行部署。
# 操作相关
# 不同格式的消息发送
一个主题只能以一种格式发送,支持通过json、avro、string、byte[]等方式发送消息。 主题A选择message_type为json格式的消息发送时,则不能再以其他格式发送消息。
# 查看历史消息
支持指定消息起始位置查看消息,history 根据这个消息id 读取后续的消息(start_index,这个需要填消息ID,不包含当前id)。
# license文件
license文件夹里无合法的license的文件,管控台服务无法启动成功。 如果这个license在使用过程中过期了,如果这时候连一个合法的license都没有,管控台会通知broiker和bookeeper关掉,管控台服务也会关掉。
# 权限
租户和命名空间需要在管控台创建好,否则后台发送时会失败,主题和订阅名称可在后台自动创建成功。 后台发送和接收消息时,需要带上认证信息token。token为管控系统中的用户的令牌。
# 消息确认
费者那边在接收到消息后是会发送确认给admq的,如果不发送确认,下次启动还会收到消息。
# 怎么设置不同的租户
topic上可以设置。比如persistent://tenant_name/namespace_name/topic_name,前面的persistent表示需要保存消息到文件里,non-persistent表示不保存。发送消息只输入主题默认就放到默认租户和默认命名空间了(public/default)。
# 客户端启动后没有收到消息
如果客户端是第一次启动,则默认情况下是不能收到该客户端启动之前生产者发送的消息的。
可以在程度里设置从最早的消息开始读取。
# 同一个订阅名称是否能设置不同的订阅模式
不能。每个 <主题, 订阅> 只能有一种模式。
# 使用事务时程序报错
默认情况下,ADMQ集群是没有开启事务支持的,需要手动修改配置文件开启事务并重启ADMQ的broker节点。
# 测试相关
# 有哪些第三方测试认证
2021/12/13 完成中测软评的产品测试。 ZCRP_YZ_20210206评测用例及执行记录
# 其他材料
- 产品彩页:ADMQ产品彩页