RocketMQ 4.7.1 报错not available now, maybe disk full, maybe your broker machine memory too small

在Mac上安装RocketMQ 4.7.1后,运行时遇到'not available now, maybe disk full, maybe your broker machine memory too small'的错误。问题源于磁盘空间使用率高达95%,超过RocketMQ默认的90%限制。解决方案是修改RocketMQ配置文件,增加一条设置,并重启broker。相关命令包括启动/关闭nameserver和broker,以及如何自动创建topic。" 8243567,1195931,ASP.NET 实现省市联动选择,"['ASP.NET开发', '前端开发', '数据库交互']

报错背景

今天在Mac上安装了rocketmq 4.7.1的最新版本,程序调用的时候,出现了报错信息如下:

Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 14  DESC: service not available now, maybe disk full, CL:  0.92 CQ:  0.92 INDEX:  0.92, maybe your broker machine memory too small.
For more information, please visit the url, http://rocketmq.apache.org/docs/faq/
	at org.apache.rocketmq.client.impl.MQClientAPIImpl.processSendResponse(MQClientAPIImpl.java:665) ~[rocketmq-client-4.7.1.jar:4.7.1]
	at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:505) ~[rocketmq-client-4.7.1.jar:4.7.1]
	at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:487) ~[rocketmq-client-4.7.1.jar:4.7.1]
	at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:431) ~[rocketmq-client-4.7.1.jar:4.7.1]
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:854) ~[rocketmq-client-4.7.1.jar:4.7.1]
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:584) ~[rocketmq-client-4.7.1.jar:4.7.1]
	... 87 common frames omitted

问题定位

  • 检查磁盘空间,已用空间是95%
  • RocketMQ的默认设置只是支持90%,超过则提示空间不足

解决方案

进入到rocketmq的安装目录下

vi bin/runbroker.sh

在里面增加一行

JAVA_OPT="${JAVA_OPT} -Drocketmq.broker.diskSpaceWarningLevelRatio=0.99"

保存后重启broker

相关命令

  1. 启动nameserver
 nohup sh bin/mqnamesrv &
  1. 启动broker,这条命令增加参数:自动创建topic
nohup sh bin/mqbroker -n 127.0.0.1:9876 -c conf/broker.conf autoCreateTopicEnable=true &
  1. 关闭broker命令
sh bin/mqshutdown broker
  1. 关闭nameserver命令
sh bin/mqshutdown namesrv

更多命令可以参考官方文档:http://rocketmq.apache.org/docs/quick-start/

应用案例

https://github.com/matevip/matecloud

在数据结构与算法中,`isFull` 是一个常用于判断线性数据结构(如栈、队列或数组)是否已满的函数。它在内存受限的实现中尤为重要,以防止溢出并确保数据完整性。`isFull` 的具体实现取决于所使用的数据结构及其存储方式。 ### 队列中的 `isFull` 在使用单维数组实现队列时,`isFull` 函数通常通过比较队列尾部指针(`rear`)是否达到数组的最大容量(`MAXSIZE`)来判断队列是否已满。具体逻辑如下: ```c int isFull(Queue Q) { return (Q.rear == MAXSIZE); } ``` 这种方式适用于顺序队列,但在循环队列中需要调整判断条件,以避免假溢出问题。例如,在循环队列中,当队头指针的前一个位置等于队尾指针时,才认为队列已满。 ### 栈中的 `isFull` 在使用数组实现栈时,`isFull` 通常通过比较栈顶指针(`top`)是否达到数组的上限来判断栈是否已满。例如: ```c int isFull(Stack S) { return (S.top == MAXSIZE - 1); } ``` 这种判断方式适用于单个栈的实现。对于共享数组实现的多个栈(如两个栈共享一个数组),需确保两个栈的指针不会相互覆盖。例如,两个栈从数组两端向中间增长,只有当两个栈的指针相遇时才认为整个数组已满。 ### 多栈共享数组的 `isFull` 在两个栈共享一个数组的实现中,栈 A 从数组的起始位置增长,栈 B 从数组的末尾位置增长。只有当两个栈的指针相遇时才认为数组已满: ```c int isFull(SharedStack S) { return (S.top1 + 1 == S.top2); } ``` 这种设计可以有效利用数组空间,避免浪费[^2]。 ### `isFull` 的应用场景 `isFull` 在以下场景中尤为重要: - **栈溢出保护**:在向栈中压入元素之前,调用 `isFull` 可防止栈溢出。 - **队列管理**:在队列操作中,`isFull` 用于控制入队操作,防止超出数组容量。 - **资源分配**:在内存受限的系统中,`isFull` 用于判断是否还能继续分配资源。 ### 示例代码:共享栈的 `isFull` 以下是一个共享数组实现两个栈的 `isFull` 函数示例: ```c typedef struct { ElementType *array; int capacity; int top1; // 栈1的栈顶指针 int top2; // 栈2的栈顶指针 } SharedStack; int isFull(SharedStack S) { return (S.top1 + 1 == S.top2); } ``` 此实现确保两个栈在数组中不会相互覆盖,只有在数组空间完全被占用时才返回 `true`。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值