Go 基础:标识符(预声明标识符,自定义标识符,关键字,类型,函数,常量)
Go 语言共有 65 个预声明的标识符,包括 25 个关键字(keywords)和 40 个其他预声明标识符。
40 个其他预声明标识符包括 20 个内置数据类型标识符,4 个常量标识符,1 个空白标识符,15 个内置函数。
Go 语言共有 65 个预声明的标识符,包括 25 个关键字(keywords)和 40 个其他预声明标识符。
40 个其他预声明标识符包括 20 个内置数据类型标识符,4 个常量标识符,1 个空白标识符,15 个内置函数。
Go 语言的 操作符 包含:算术运算符,位运算符,赋值和赋值复核运算符,比较运算符,逻辑运算符,自增自减操作符,其他运算符。
Go 的操作符 与 Java 有点点不一样。
Java 的一个很重要的优点就是提供了垃圾回收器(Garbage Collection,GC)来自动管理内存,不用向 C 语言样需要开发人员手动来释放内存。但也不等于完全不管内存的使用,系统在线上长期运行后,可能出现内存泄漏耗尽内存,系统卡死或崩溃。
若剩余内存满足不了申请的需要,或申请不到连续内存,就会存在内存溢出问题(OOM),系统就会抛出 Error,导致业务逻辑无法正常执行。
对开发人员来说应该能分析 内存泄漏 和 内存溢出 问题的根源,彻底解决问题,而不仅仅是重启应用或扩大内存。
发布者确认解决了消息发送传输过程中因网络故章导致丢失消息的问题,RabbitMQ 为消息者确认提供了 自动确认 和 手动确认 两种方式。
消费者预取可以限制在回传确认消息之前接收的消息数量,消费者优先级允许高优先级的消息者优先接收消息,当高优先级消费者阻塞时,消息只会传递给低优先级消费者。
RabbitMQ 提供了在声明队列时或发送消息时给消息设置过期时间。死信队列为处理过期或不能正确路由的消息提供了驻留场所,可以防止消息丢失,便于分析无法消费的原因。
消息过期时间配合死信队列可以实现延迟队列的功能。优先队列中优先级高的消息被优先消费。RabbitMQ 持久化支持交换器持久化,队列持久化,消息持久化。持久化可以提高 RabbitMQ 的可靠性,防止服务器重启或宕机导致数据丢失。
现在的 Java 应用大多会基于 Spring 框架开发,Spring 为集成 RabbitMQ 提供了封装好的依赖库 spring-rabbit
,一些重复性的工作只需要通过 XML 一次性配置。Spring Boot 也为 RabbitMQ 提供了 start 依赖库,少许配置就可直接使用。
封装带来了使用的便捷性,但仍有必要了解其内部的一些运行流程和机制,方便在实际开发过程中灵活运用,也易于快速定位和解决问题。
本篇对 RabbitMQ 原生 Java 客户端 amqp-client
的运行流程进行讲解,大致涉及连接,交换器,队列,发送消息,消费消息,消息消费确认,拒绝消息等。
RabbitMQ 是部署最广泛的开源消息代理,有成千上万的用户,是最受欢迎的开源消息中间件之一。
RabbitMQ(兔子) 轻巧,易于在内部和云上部署。可以分布式集群部署,以满足大规模,高可用性的要求。
RabbitMQ 是由 Erlang 语言开发的基于 AMQP (Advanced Message Queuing Protocol:高级消息队列协议)标准的开源实现。目前最新版本是 RabbitMQ 3.8.14(2021-03-02) 。 版本实现的 AMQP 0-9-1 版本协议。还可以通过插件的方式支持 STOMP 和 MQTT 等协议。
要使用 RabbitMQ,需先理解其基本概念,而 RabbitMQ 原生是实现 AMQP 0-9-1 版本协议的,RabbitMQ 基本概念来自于 AMQP 0-9-1 协议中的定义,所以就有必要了解协义中的相关概念。
AMQP 0-9-1(Advanced Message Queuing Protocol:高级消息队列协议)是一种消息传递协议,它两个应用可以通过中间件代理通信。RabbitMQ 实现该版本的协议,下面描述的概念和述语也是基本此版本协议。
Java 的线程即是工作单元,也是执行机制。从 JDK 5 开始,把工作单元与执行机制分离开来。工作单元包括 Runnable 和 Callable,而执行机制由 Executor 框架提供。
Executor 提供了一种将任务提交与每个任务如何运行的机制分离的方法(包括线程使用,调度的详细信息)。
Java 应用中对宝贵的稀缺资源池化是保障系统稳定运行,优化系统响应速度的重要手段。
线程池的运用场景非常广,几乎所有需要异步或并发执行任务的程序都可以使用线程池。