利用Redis发布订阅完成tomcat集群下的消息通知

博主是刚入职半年的新手,如果有说的不对的地方请各位大佬见谅!



  

  这是博主的第一篇博客,可能排版以及一些描述有不合理的地方还请勿喷,希望大家尽可能的多给我这样的新手一些鼓励让我能在写博客的道路上走下去。



进入正题,首先开发背景



   

  近期公司的一些项目上出现了内存溢出的问题,究其原因是缓存的数据量太大导致jvm内存溢出,产品的架构上比较老所以针对缓存这块,领导叫我去重构移植到Redis中,博主之前并没有学习过Redis以及关于分布式系统的并发问题,所以也是对我的一次挑战,还好没有辜负领导的期望在期望时间之前完成了任务,废话不多说,下面讲讲我对Redis发布订阅以及实现应用集群的分布式锁。



利用Redis的发布订阅实现各个tomcat的消息通知



  首先了解一下Redis的发布与订阅,Redis的发布订阅是基于Redis的组成架构 :Redis Client和Redis Server,具体关于Redis发布订阅的信息请查阅这里,利用Redis的该特性,只要将Redis单点同时设置为订阅者与发布者,那么当有一个tomcat发送消息给Redis,Redis去发布该消息时就会通知到所有的节点,这样就实现了各个节点间的消息通知

  下图大概描述一下整个消息的传递。

  至于实现,博主使用的是java,继承JedisPubSub类重写它的onSubscribe、onUnsubscribe、onMessage三个方法实现订阅者类,再利用jedis.publish()去发布信息。

  整个过程中需要注意的是,再发布消息后执行的动作必须放在onMessage中,不能放在发布消息的过程中,因为一个节点去发布消息后,Redis还会反向通知到这个节点,如果在发布消息的过程中执行动作会导致该节点的动作重复执行,所以整个过程可以分为两个部分第一是去发布消息不做任何其他多余动作,二是接收消息立即去执行对应动作。

  需要注意的是Redis的发布订阅不会做持久化所以如果在发布信息时Redis宕机会导致消息丢失并且无法恢复,如果业务场景中丢失消息会导致严重结果请慎用!

  



感谢

  其实在本次的项目中还有许多关于Redis以及分布式锁的体会,在后面也会写出来供大家参考一下,感谢各位看到这里的读者!

原文地址:https://www.cnblogs.com/buggeerWang/p/10318750.html

时间: 2024-10-02 16:29:05

利用Redis发布订阅完成tomcat集群下的消息通知的相关文章

用redis实现tomcat集群下的session共享

上篇实现了 LINUX中NGINX反向代理下的TOMCAT集群(http://www.cnblogs.com/yuanjava/p/6850764.html) 这次我们在上篇的基础上实现session 共享问题 Nginx机器:192.168.1.108 两台tomcat机器分别是:192.168.1.168 192.168.1.178 一:测试session共享问题 在原index.jsp页面添加如下代码 SessionId:<%= session.getId() %> <% Stri

在tomcat集群下利用redis实现单点登陆

场景:比如说我们要实现一个集群环境,无非是把多个项目部署到多个tomcat下,然后按照一定的算法,轮询什么的随机访问多个tomcat服务器,但是问题也会有许多,比如说,我们最开始是把登陆人的信息存放到session中,但是如果是集群的情况下,比如我第一次登陆,把信息存放到session里面,但是我第二次访问的时候,访问到了第二台服务器,第二台服务器里面没有session信息,我们还得再登陆一遍,问题显而易见,session数据共享的问题. 解决思路:我们不要把信息存放到服务器的session中,

ActiveMQ(11):集群下的消息回流功能

一.简介 1.1 "丢失"的消息 有这样的场景,broker1和broker2通过networkConnector连接,一些consumers连接到broker1,消费broker2上的消息.消息先被broker1从broker2上消费掉, 然后转发给这些consumers.不幸的是转发部分消息的时候broker1重启了,这些consumers发现broker1连接失败,通过failover连接到broker2上去了,但是 有一部分他们还没有消费的消息被broker2已经分发到了bro

ActiveMQ集群下的消息回流功能

------------------------------------------------------------------ "丢失"的消息 如果有broker1和broker2通过networkConnector连接,有一个consumer1连接到broker1,一个consumer2连接到broker2,程序往broker1上面发送30条消息,这时consumer2连接到broker2消费消息,当consumer2消费了15条消息时,broker2挂掉了. 但是还剩下15条

集群下使用redis统一session处理

pom依赖(快照版): <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>

Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享

muke慕课实战课程分享QQ313675301 新增课程: Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享 后端开发: 1.高级java软件架构师实战培训视频教程2.大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程3.Spark Streaming实时流处理项目实战4.Java校招面试 Google面试官亲授5.Java开发企业级权限管理系统6.Java大牛 带你从0到上线开发企业级电商项目7.Java

Java企业级电商项目实战 Tomcat集群与Redis分布式

本套课程包含:java电商项目实战课程 Tomcat集群视频教程 Redis项目实战课程课程目录1-1 课程导学1-2 大型Java项目架构演进解析1-3 一期课程与问答服务回顾1-4 一期项目结构和代码回顾1-5 课程使用系统及技术版本介绍(一期+二期)1-6 二期项目初始化第2章 Lombok框架集成及原理解析本章会对Lombok框架进行介绍,同时会讲解Lombok的原理.并手把手领着小伙伴们实战,引入Lombok以及IDE安装Lombok插件.然后会带着大家实战Coding,讲解@Data

Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式

Java企业级电商项目架构演进之路  Tomcat集群与Redis分布式 Redisson介绍Redisson是架设在Redis基础上的一个java驻内存数据网格.Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势.在java使用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类.使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度.同时结合各富特色的分布

高性能站点架构之负载均衡 Nginx+tomcat+redis实现tomcat集群

上一篇文章给大家讲了Nginx的安装,那么这篇文章为大家讲一下Nginx+Tomcat实现负载均衡. 先说说为什么要用ngnix 做负载均衡.事实上做负载均衡的最出名的莫过于F5了.F5是在硬件设施,动辄几万,几十万,几百万不等,对于一般的小公司来说,这也是一笔非常大的开销.所以能尽量的使用软件.还是使用软件,效果上尽管会差一些,可是还是可以起到一定的作用的. 环境准备 三台装有centos6.5 系统的机器.当中两台机器上装有tomcat7,一台机器上装有nginx3.0.2,至于详细怎样安装