Java学习总结 2-1-2 RabbitMQ

乱七八糟的整理,建议全屏,否则排版可能会很奇怪~~

什么是RabbitMQ
    RabbitMQ是一个开元的AMQP实现,服务端用ERlang语言编写,支持多种客户端。用于在分布式系统中存储转发纤细,在易用性、扩展性、高可用性等方面表现不俗

    5672,5671
    
RabbitMQ的用户角色分类
    none、management、policymaker、monitoring、administrator
  用户:
    none:
        不能访问management plugin
    management:查看和管理自己的信息
        用户可以通过AMQP做的任何事外加:
        列出自己可以通过AMQP登入的virtual hosts
        查看自己的virtual hosts中的queues,exchange和bindings
        查看和关闭自己的channels和connections
        查看有关自己的cirtual hosts的“全局”的统计信息,包含其他用户在这些cirtual hosts中的活动
    policymaker:
        management基础上增加
        查看、创建和删除自己的virtual hosts所属的policies和parameteres
    monitoring:查看,监控
        management基础上增加
        列出所有virtual hosts,包括他们不能登录的virtual hosts
        查看其他用户的connections和channels
        查看节点级别的数据入clustering和memory使用情况
        查看真正的关于所有virtual hosts的全局的统计信息
    administrator:管理员权限
        policymaker和moniroeing基础上增加
        创建和深处virtual hosts
        查看、创建和删除users
        查看创建和删除permissions
        关闭其他用户的connections
    
    
安装
    erlang    
        https://github.com/rabbitmq/erlang-rpm/releases
    yum install -y socat
    启动:systemctl start rabbitmq-server
    查看状态:systemctl status rabbitmq-server
    停止服务:systemctl stop rabbitmq-server
    开机自启:systemctl enable rabbitmq-server
    开启插件:rabbitmq-plugins enable rabbitmq_management  说明:rabbitmq有个默认的guest用户,但只能通过localhost访问,所以需要添加用户够远程访问的用户
    添加用户:rabbitmqctl add_user admin admin
    为用户分配操作权限:rabbitmqctl set_user_tags admin administrator
    为用户分配资源权限:rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
    开放防火墙端口:firewall-cmd --zone=public --add-port=15672/tcp --permanent
    

AMQP协议
    AMQP(Advanced Message Queueing Protocol)高级消息队列协议,是应用层协议的一个开放标准为面向消息的中间件设计
    AMQP结构:
        
    AMQP生产者流转过程:


    
    
-->rabbitmq如何发送消息
    RabbitMQ中消息发送至Queue时先发送至Exchange(交换机)又Exchange发送至Queue,在Rabbit中一共有4种Exchange
        发送消息时不指定Exchange默认使用Queue的名称直接匹配到对应的Queue,因为在消息发送时直接指定了Queue
        Fanout Exchange: 队列绑定在Exchange上,当消息发送到交换机上时,Exchange把消息发送至所有绑定在自己身上的Queue
        Direct Exchange: 队列绑定在Exchange上并指定BindKey,Exchange根据BindKey指定发送给符合匹配的Queue
        Topic Exchange:  队列绑定在Exchange上并指定routing key,Exchange根据routing key指定发送给符合匹配的Queue,routing key可以使一个有通配的规则,假如routing key为“com.#”,那么所有以“com.”绑定在Exchange上的Queue都将会收到消息
        Herders Exchange: 队列绑定在Exchange上并指定属性(例x=1),Exchange根据属性值指定发送给符合匹配的Queue   --性能不高,不常用
    
    运转流程:

    
高可用
    集群安装:
    在集群环境中,默认只同步元数据。假如两个实例做集群,node1中有数据,node2只同步元数据,数据存在node1中,消费者绑定了node2,
    可以看到node2(node1)中的数据,也可以消费node2(node1)的数据。这样数据在一台服务器上会有单点故障问题,所以要做高可用方案
    元数据包括:
        队列元数据:队列的名称及属性
        交换器:交换器的名称及属性
        绑定关系元数据:交换器与队列或者交换器与交换器
        vhost元数据:为vhost内的队列、交换器和绑定提供命名空间及安全属性之间的绑定关系
    高可用方案:
        镜像队列模式:不仅要同步对象的描述信息,也要同步数据
        镜像队列模式配置:
            可直接在控制台中配置:
                在admin账户中选中Admin,选择Policies(策略)新增策略
                选择该策略名称,应用范围(正则),类型(exchange或queue或全部),优先级(数字越大越高),同步的节点数(这条消息同步到几个节点,推荐三个)
                配置完后点击add policy
    
    
持久化
    rabbitmq的持久化分为:队列持久化、消息持久化和交换器持久化、不管是持久化的消息好事非持久化的消息都可以被写入到磁盘
    队列持久化:
        队列的持久化是在定义队列时的durable参数来实现的,durable为true时,队列才会持久化
            Connection connection = connectionFactory.newConnection();
            Channel channel = connection,createCHannel();
            //第二个参数设置为true,即dutable=true
            channel.queueDeclare("queue1",true,false,false,null);
        在控制台中,持久化的队列在管理界面可以看到有个“D”的标识
    消息持久化:
        消息持久化通过消息的属性deliveryMode来设置是否持久化,在发送消息时通过basicPublish的参数传入
        //通过传入MessageProperties.PERSISTENT_TEXT_PLAIN就可以实现消息持久化
        channel.basicPublish("","queue1",MesdsageProperties.PERSISTENT_TEXT_PLAIN,"persistent_test_message".getBytes);
    交换器持久化:
        同队列一样,交换器也需要在定义时设置持久化标识,否则在Broker重启之后将丢失
        //dutrtable为true则开启持久化
        Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable) throes IOException;
    
    
内存控制
    当内存使用超过配置的阈值或者磁盘剩余空间低于配置的阈值时,RabbitMq会暂时阻塞客户端的连接,并停止接收从客户端你发来的消息,
    以此避免服务崩溃,客户端与服务端的心跳检测也会失效,当出现内存告警时,可以通过管理命令临时调整内存大小,默认内存阈值时0.4
    
    当磁盘剩余空间低于确定的阈值时,RabbitMQ同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务崩溃,
    默认情况下,磁盘阈值为50m,便是当磁盘剩余空间低于50m时会阻塞生产者并停止内存中消息的换页动作。一个相对谨慎的做法是将磁盘阈值设置为
    操作系统锁显示的内存大小一致
    内存换页:
        假如rabbitmq最大占用内存为1000m,阈值为0.5,当存储的数据大小超过500m时,把内存中的500m数据持久化到磁盘上,释放内存空间

        
磁盘控制
    与内存控制原理相同,内存分页之后的数据保存在磁盘上,当擦盘剩余空间低于预设的值时,磁盘预警
    

消息可靠性
    RabbitM去的消息可靠性,一般是业务系统接入消息中间件是首要考虑的问题,一般通过三个方面保障
        发送可靠性:确保消息成功发送到Broker
        存储可靠性:Broker对消息持久化,确保消息不会丢失
        消息可靠性:确保消息成功被消费
    
        一般消息发送可靠性分为三个层级
            1、At most once:最多一次,消息可能会丢失,但绝对不会重复传输
            2、At lwast once:最少一次,消息绝对不会丢失,但可能会重复传输
            3、Exactly ince:恰好一次,每条消息肯定会被传输一次且仅传输一次
            RabbitMQ支持其中的“最多一次”和“最少一次”,使用中“最多一次”被抛弃,因为无法确定消息被发送至MQ中
            其中"做少一次"投递实现需要考虑:
                1、消息生产者需要开启事务机制或者publisher confirm机制,以确保消息可以可靠的传输到RabbitMQ中
                2、消息生产者需要配合使用mandatory参数或者备份交换器来确保消息能够从交换器路由到队列中,进而能够保存下来而不会被丢弃
            
        
    消息消费可靠性:
        (x-dead-letter-exchange)死信队列:出现异常或超时的消息保存在死信队列上

        
插件机制
    rabbitMQ控制台就属于插件。
    通过插件可以扩展多种核心功能:支持多种协议、系统状态监控、其它AMQP 0-9-1交换类型、节点联合等。
    许多功能都是通过插件实现的

    查看插件列表:
        rabbitmq-plugins list
    启用/禁用插件
        rabbitmq-plugins enable plugin-name
        rabbitmq-plugins disable plugin-name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
实现 Spring Boot、RabbitMQ 和 WebSocket 结合的方式主要有以下几个步骤: 1. 创建 Spring Boot 项目,添加 RabbitMQ 和 WebSocket 的相关依赖。 2. 创建 RabbitMQ 队列和交换机,用于发送消息。 3. 创建 WebSocket 配置类,配置 WebSocket 的相关参数。 4. 创建 WebSocket 处理器类,处理 WebSocket 的连接、消息发送等操作。 5. 创建 RabbitMQ 消息监听器类,监听 RabbitMQ 队列中的消息,将消息发送给 WebSocket 处理器。 下面是具体的实现步骤: 1. 创建 Spring Boot 项目,添加 RabbitMQ 和 WebSocket 的相关依赖。 在 pom.xml 中添加以下依赖: ```xml <dependencies> <!-- RabbitMQ 相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!-- WebSocket 相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> </dependencies> ``` 2. 创建 RabbitMQ 队列和交换机,用于发送消息。 在 RabbitMQ 中创建一个交换机和一个队列,然后将队列绑定到交换机上。这里我们使用 RabbitMQ 的默认交换机和队列。 ```java @Configuration public class RabbitMQConfig { @Bean public Queue queue() { return new Queue("websocket"); } @Bean public DirectExchange exchange() { return new DirectExchange(""); } @Bean public Binding binding(Queue queue, DirectExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with("websocket"); } } ``` 3. 创建 WebSocket 配置类,配置 WebSocket 的相关参数。 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS(); } } ``` 4. 创建 WebSocket 处理器类,处理 WebSocket 的连接、消息发送等操作。 ```java @Component public class WebSocketHandler implements WebSocketHandler { private static final Logger logger = LoggerFactory.getLogger(WebSocketHandler.class); private SimpMessagingTemplate messagingTemplate; @Autowired public WebSocketHandler(SimpMessagingTemplate messagingTemplate) { this.messagingTemplate = messagingTemplate; } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.info("WebSocket connected: {}", session.getId()); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { logger.info("WebSocket received message: {}", message.getPayload()); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { logger.error("WebSocket transport error: {}", exception.getMessage()); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { logger.info("WebSocket disconnected: {}", session.getId()); } @Override public boolean supportsPartialMessages() { return false; } public void sendMessage(String message) { messagingTemplate.convertAndSend("/topic/messages", message); } } ``` 5. 创建 RabbitMQ 消息监听器类,监听 RabbitMQ 队列中的消息,将消息发送给 WebSocket 处理器。 ```java @Component public class RabbitMQListener { private static final Logger logger = LoggerFactory.getLogger(RabbitMQListener.class); private WebSocketHandler webSocketHandler; @Autowired public RabbitMQListener(WebSocketHandler webSocketHandler) { this.webSocketHandler = webSocketHandler; } @RabbitListener(queues = "websocket") public void handleMessage(String message) { logger.info("RabbitMQ received message: {}", message); webSocketHandler.sendMessage(message); } } ``` 至此,Spring Boot、RabbitMQ 和 WebSocket 结合的实现就完成了。我们可以通过 RabbitMQ 发送消息到队列,然后监听器会将消息发送给 WebSocket 处理器,处理器再将消息发送给 WebSocket 客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值