为什么高并发需要用消息队列?
一、消息队列的特性 业务无关,一个具有普适性质的消息队列组件不需要考虑上层的业务模型,只做好消息的分发就可以了,上层业务的不同模块反而需要依赖消息队列所定义的规范进行通信。 FIFO,先投递先到达的保证是一个消息队列和一个buffer的本质区别。 容灾,对于普适的消息队列组件来说,节点的动态增删和消息的持久化,都是支持其容灾能力的重要基本特性。当然,这个特性对于游戏服务器中大部分应用中的消息队列来说不是必须的,这个也是跟应用情景有关的,很多时候没有这种持久化的需求。 性能,这个不必多说了,消息队列的吞吐量上去了,整个系统的内部通信效率也会有提高。 二、为什么需要消息队列? 当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。“ 消息 ”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中,“ 消息队列 ”是在消息的传输过程中保存消息的容器 。 举几个例子 1)业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力。就可...
阿里 Druid 连接池监控的两个坑
阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性。但在实际情况中也有不少坑,说下最近遇到的一个坑吧! 问题1:不断打印error级别的错误日志 session ip change too many 下面是其报错的关键源码 com.alibaba.druid.support.http.stat.WebSessionStat#addRemoteAddress public void addRemoteAddress(String ip) { if (remoteAddresses == null) { this.remoteAddresses = ip; return; } if (remoteAddresses.contains(ip)) { return; } if (remoteAddresses.length() > 256) { LOG...
一次 Druid 连接池泄露引发的血案。。
最近某个应用程序老是卡,需要重启才能解决问题,导致被各种投诉,排查问题是 Druid 连接池泄露引发的血案。。 异常日志如下: ERROR - com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 50, maxActive 50, creating 0 at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1512) at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1255) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5007) at com.alibaba.druid.filter.stat.StatFilte...
阿里 Druid 连接池的坑。。
Druid的坑当查询数据库的Clob转换为Oracle Clob类型的时候。 java.lang.ClassCastException: com.alibaba.druid.proxy.jdbc.ClobProxyImpl cannot be cast to oracle.sql.CLOB 问题原因ClobProxyImpl不能转换为Oracle的Clob字段,这也是醉了。 原因是Druid为Clob字段增加了代理类:com.alibaba.druid.proxy.jdbc.ClobProxyImpl,然后代码里面强制转换成Oracle的Clob就出现了这个问题。 解决方案现在的解决方案是先转换为Druid的代理类ClobProxy对象,然后获取原生的Oracle Clob字段内容即可。 public class ClobUtil { public static CLOB parseOracleClob(Clob clob) { SerializableClob sclob = (SerializableClob) clob; Clob...
Spring Boot & Kafka 实战
Kafka集群安装、配置和启动Kafka需要依赖zookeeper,并且自身集成了zookeeper,zookeeper至少需要3个节点保证集群高可用,下面是在单机linux下创建kafka3个节点伪集群模式。 1、下载包 下载地址:http://kafka.apache.org/downloads 2、解压包 tar -zxvf kafka_2.11-1.0.0.tgzmv kafka_2.11-1.0.0 kafka1mv kafka_2.11-1.0.0 kafka2mv kafka_2.11-1.0.0 kafka3 3、创建ZK集群 修改ZK配置文件:kafka1-3/config/zookeeper.properties分别修改对应的参数。 dataDir=/usr/local/kafka/zookeeper1 dataLogDir=/usr/local/kafka/zookeeper/log clientPort=218...
告诉你,Kafka 是个牛逼货!
Kafka简介 Kafka是一种高吞吐量的分布式发布订阅消息系统,是消息中间件的一种。它可以处理消费者规模的网站中的所有动作流数据,它是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。 kafka可用于构建实时数据管道和流应用程序,具有横向扩展、容错、wicked fast(变态快)等优点,并已在成千上万家公司运行。 官网:kafka.apache.org/ Kafka相关术语 Broker Kafka集群包含一个或多个服务器,这种服务器被称为broker。 Topic 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。 Partition Partition是物理上的概念,每个Topic包含一个或多个Partition。 Producer 负责发布消息到Kafka broker。 Consumer 消息消费者,向Kafka broker读取消息的客户端。 Consumer Group 每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group n...
Spring Boot 真是个牛逼货!
现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下。 Spring Boot 的背景了解 Spring Boot 必须先说说 Spring 框架! 在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大。 用过 Spring 框架的都知道 Spring 能流行是因为它的两把利器:IOC 和 AOP,IOC 可以帮助我们管理对象的依赖关系,极大减少对象的耦合性,而 AOP 的切面编程功能可以更方面的使用动态代理来实现各种动态方法功能(如事务、缓存、日志等)。 而要集成 Spring 框架,必须要用到 XML 配置文件,或者注解式的 Java 代码配置。无论是使用 XML 或者代码配置方式,都需要对相关组件的配置有足够的了解,然后再编写大量冗长的配置代码。 然后又有多少开发人员能精通这些配置呢?如果我们只提供一些配置参数让框架能自动配置这些组件,那是不是 so easy? 基于简化 Spr...
Spring Boot 实现热部署
在Spring Boot实现代码热部署是一件很简单的事情,代码的修改可以自动部署并重新热启动项目。 引用devtools依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> 这样,当修改一个java类时就会热更新。 自定义配置热部署以下配置用于自定义配置热部署,可以不设置。 # 热部署开关,false即不启用热部署 spring.devtools.restart.enabled: true # 指定热部署的目录 #spring.devtools.restart.additional-paths: src/main/java # 指定目录不更新 spring.devt...
Java 5 ~ 10 新特性倾情整理!
最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了。 为了大家对JDK有一个全面的了解,下面我为大家整理了JDK5~10的所有关键新特性! JDK5新特性 自动装箱与拆箱 枚举 静态导入 可变参数(Varargs) 内省(introspector) 泛型(Generic) For-Each循环 JDK6新特性 Desktop类和SystemTray类 使用JAXB2来实现对象与XML之间的映射 理解STAX 使用Compiler API 轻量级 Http Server API 插入式注解处理 API 使用Console开发控制台程序 对脚本语言的支持 Common Annotations Java GUI界面的显示 嵌入式数据库Derby Web服务元数据 Jtable的排序和过滤 更简单更强大的JAX-WS JDK7新特性 switch中可以使用字符串了 泛型实例化类型自动推断 自定义自动关闭类 新增一些读取环境信息的工具方法 Boolean类型反转,空指针安全,参与位运算 两个...
Hashtable 为什么不叫 HashTable?
什么是驼峰命名规则,来看下面的关键字: HashMap ArrayList ConcurrentHashMap 简单来说就是,标识符的每个单词首字母必须大写,看起来像是驼峰的形状。 当时就很好奇,Hashtable 为什么不是 HashTable 呢?作为一名初级的 Java 程序员都应该知道的基本的驼峰命名规则,为什么 JDK 代码里面还有这种不规范的命名呢? 我想大家应该都比较好奇,我特意去查了下资料,没有查到官方的说法,不过在 stackoverflow 上看到了同样的这个问题。 原贴如下: https://stackoverflow.com/questions/12506706/why-is-the-t-in-hash-tablehashtable-in-java-not-capitalized 最佳答案是: Hashtable was created in Java v1. The consistent naming conventions for collections were established later, in Java2, when th...
