《RabbitMQ 实战指南》读书笔记

RabbitMQ的模型架构介绍
可以把消息传递的过程想象成:当你将一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上, RabbitMQ 就好比由邮局、邮箱和邮递员组成的一个系统。
  • producer:生产者(发件人),消息的投递方
  • broker:消息中间件的中间节点(邮局,也可以看作一台Rabbit MQ服务器)
  • exchange:交换器(中分拣员),它根据分发规则,匹配查询表中的routing key,分发消息到queue中去。
  • queue:队列(收件人查收信件时的邮箱)
  • routingkey:路由键(填写在包裹上的地址),在某些情形下, RoutingKey 与BindingKey 可以看作同一个东西。
  • bing:绑定(???),通过绑定将exchange和queue关联起来,某些情况下会分配一个bandingkey(direct、topic)
  • bandingkey:绑定键(于包裹的目的地)
  • comsumer:消费者(收件人),消息的消费方
Exchange分类
  • fanout(广播,一对多)、不用配置RoutingKey 和 BandingKey,交换器会无视BindingKey将消息路由到所有绑定到该交换器的队列中。
  • direct(直连,一对一)、RoutingKey 和 BandingKey 必须相同,消息才能正常发送到queue
  • topic(主题,模糊,一对多)、RoutingKey 和 BandingKey 做模糊匹配,两者不是相同的
  • headers(基本上不用)
Routingkey中可以包含两种通配符
  • “.”  字符串分割符
  • “#” 通配任何零个或多个word
  • “*” 通配任何单个word

connection 和 channel 之间的关系
Connection 可以用来创建多个Channel 实例,但是Channel 实例不能在线程问共享,应用程序应该为每一个线程开辟一个Channel 。某些情况下Channel 的操作可以并发运行,但是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响友送方确认( publisherconfrrm)机制的运行,所以多线程问共享Channel 实例是非线程安全的RabbitMQ 采用类似NIO的做法,选择TCP 连接复用,不仅可以减少性能开销便于管理。同时RabbitMQ 可以确保每个线程的私密性,就像拥有独立的连接一样。当每个信道的流量不是很大时,复用单一的Connection 可以在产生性能瓶颈的情况下有效地节省TCP 连接资源。

每个线程把持一个信道(channel),所以信道复用了Connection 的TCP 连接。当信道本身的流量很大时,这时候多个信道复用一个Connection 就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个Connection ,将这些信道均摊到这些Connection 中,Connection 可以用来创建多个Channel 实例,但是Channel 实例不能在线程问共享,应用程序应该为每一个线程开辟一个Channel 。某些情况下Channel 的操作可以并发运行,但是在其他情况下会导致在网络上出现错误的通信帧交错,同时也会影响友送方确认( publisher confrrm)机制的运行,所以多线程问共享Channel 实例是非线程安全的。


AMQP 生产者发送消息流程
AMQP 消费者发送消息流程

高级参数
  • mandatory 参数
  • alternate-exchange 备份交换机
  • 过期时间 TTL
    • 设置消息ttl:x-message-ttl
    • 设置队列ttl:x-expires
  • 死信队列 x-dead-letter-exchange
  • 延迟队列,没有直接支持,通过DLX 和TTL 模拟出延迟队列的功能。
  • 优先级队列 x-max-priority

Tomcat重启脚本

由于近期用jenkin发版的时候,发现其中重启tomcat发布服务功能总是不能正常生效,所以我想在jenkin中调用自己写的一段shell脚本来完成重启tomcat的工作

 

上传文件大小导致失败

【问题场景】 在本地开发环境,上传超过2MB的数据都可以成功上传至服务器。但是,在测试环境出现上传超过200K就会失败的问题。 前端使用的是springMVC,中间件使用Nginx + Tomcat

【排查方法】 1、检查不同环境下的spring配置文件中,上传文件大小限制

两个环节的代码都是同样的配置,没有问题,排查spring问题

2、检查两个环境的tomcat配置 conf/server.xml

当maxPostSize<=0时,POST方式上传的文件大小不会被限制。配置一致,排除tomcat配置问题, 注意:maxPostSize参数只有当request的Content-Type为“application/x-www-form-urlencoded”时起作用。 参考资料 https://blog.csdn.net/lafengwnagzi/article/details/72846195

3、检查两个环境的nginx配置

最终发现,测试环境的nginx配置不一致导致,问题定位成功 参考资料 https://blog.csdn.net/bruce128/article/details/9665503

【总结】 需要问题不要着急,先自查,从自己的代码入手。如果代码确认没有问题,就外范围扩大,看一下外部环境是否存在问题,一般情况都可以准确定位。

Weblogic下无法显示验证码(Linux环境下)

问题描述:
linux服务器中,weblogic环境下起应用程序,登录后不显示验证码。解决参考办法是:
找到你创建域名中的启动目录文件,即找到bin目录下的startWebLogic.sh文件
/oracle/middleware/user_projects/domains/ahzc/bin
搜索 DOMAIN_HOME 或者搜索你创建域的名称
在上面的几行有内容:
如下

添加 -Djava.awt.headless=true”,添加后的显示如下:

“orcibly releasing inactive connection” 异常处理

【异常信息】:

【原因分析】:
由于WebLogic内部设置了对于数据源超时非活动连接关闭机制,但是由于我们程序中执行SQL处理了数据量较大,最终导致我们程序执行的时间已经超出WebLogic内设置的数据源超时非活动连接时间,程序中SQL还没有执行完成,WebLogic就强制关闭了程序和数据库之间的连接。

【解决方案】:
1、首先打开所要设置的数据源。
2、然后设置非活动超时连接时间。
注意:要设置关闭非活动连接的总时间,除以4 就是这个参数所有填写值,此参数值单位为秒。

【参考资料】:
http://www.blogjava.net/fjin/archive/2013/10/10/404841.html
http://impradeep.com/forcibly-releasing-inactive-connection-weblogic-jdbc-wrapper-poolconnection_oracle_jdbc_driver_t4cconnectiond72/