简介

HikariCP 是用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能,另外,和 druid 一样,HikariCP 也支持监控功能。HikariCP 是目前最快的连接池,就连风靡一时的  BoneCP  也停止维护,主动让位给它,SpringBoot 也把它设置为默认连接池。

看过 HikariCP 源码的同学就会发现,相比其他连接池,它真的非常轻巧且简单,有许多值得我们学习的地方,尤其性能提升方面,本文也就针对这一方面重点分析。本文将包含以下内容(因为篇幅较长,可根据需要选择阅读):

  1. HikariCP 的使用方法(入门案例、JDNI 使用、JMX 使用)

  2. HikariCP 的配置参数详解

  3. HikariCP 源码分析

1、PTP模型

Point-to-Point,点对点通信模型。PTP是基于队列(Queue)的,一个队列可以有多个生产者,和多个消费者。消息服务器按照收到消息的先后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费,消费之后就会从队列中移除。

需要注意的是,尽管这里使用Queue的概念,但并不是先进入队列消息,一定会被先消费。在存在多个下游Consumer情况下,一些消息中间件,例如ActiveMQ,为了提升消费能力,会将队列中的消息分发到不同Consumer并行进行处理。这意味着消息发送的时候可能是有序的,但是在消费的时候,就变成无序了。为了保证消费的有序,一些MQ提供了**"专有消费者”或者"排他消费者”**的概念,在这种情况下,队列中的消息仅允许一个消费者进行消费,如果存在多个消费者,那么从中选择一个。但是,这意味着在消息在处理中没有了并行性。如果消息量很多的情况下,将会产生消息积压。为了解决"专有消费者”的性能问题,一些消息中间件采用分区的概念来解决性能问题,我们将在后文进行介绍。

2、Pub/Sub模型

publish-and- subscribe, 即发布订阅模型。在Pub/Sub模型中,生产者将消息发布到一个主题(Topic)中,订阅了该Topic的所有下游消费者,都可以接收到这条消息。如下图:

通常情况下,一个条消息只要被消费一次就行了,那么什么情况下需要所有的消费者都对这条消息进行消费呢?最典型的情况就是需要在内存中对数据进行缓存,并需要实时进行更新。例如,笔者做过一个违禁词系统,对用户输入的评论内容进行违禁词汇检测。这个违禁词系统,部署了在N台服务器上,为了提升检测性能,每台机器都会将违禁词库全量加载到内存中,词库的更新,是通过发送MQ消息来完成的。由于采用Pub/Sub模型,每台机器的consumer,都可以接收到这条消息,直接在内存中更新敏感词库即可。

3、Partition模型

为了解决在PTP模型下,有序消息需要通过"专有消费者”消费带来的性能问题,一些消息中间件,如rocketmq,kafka采用了Partition模型,即分区模型,如下所示:

生产者发送消息到某个Topic中时,最终选择其中一个Partition进行发送。你可以将Parition模型中的分区,理解为PTP模型的队列,不同的是,PTP模型中的队列存储的是所有的消息,而每个Partition只会存储部分数据。对于消息者,此时多了一个消费者组的概念,Paritition会在同一个消费者组下的消费者中进行分配,每个消费者只消费分配给自己的Paritition。上图演示了不同的消费者可能会分配到不同数量的Paritition。Paritition模式巧妙的将PTP模型和Pub/Sub模型结合在了一起:

对于PTP模型:

一条消息只会由一个消费者进行消费,而Partition模型中每个分区最终也只会有一个消费者进行消费。对于通过"专有消费者"来保证全局消费有序的场景,在Partition模型中,只需保证创建的Topic只有一个Partition即可,这个Paritition最终也只会分配其中一个消费者。另外,在绝大部分场景下,我们没有必要保证全局有序,例如一个订单产生了3条消息,分别是订单创建,订单付款,订单完成。消费时,要按照这个顺序消费才能有意义。但是订单之间是可以并行消费的,例如将订单1产生的3条消息发送到Partiton 1,将订单2产生的3条消息发送到Partition 2,如此便达到了不同订单之间的并行消费。

对于Pub/Sub模型:

一条消息所有的下游消费者都可以进行消费。在Paritition模型中,只需要为每个消费者设置成不同的消费者组即可。然而,过多的消费者组,会给消息中间件运维带来麻烦。所以一些消息中间件,结合了Partition模型和Pub/Sub模型。例如RocketMQ,支持为消费者组设置消费模式,如果是集群模式,就按照上述描述进行消费,如果是广播模式,就按照Pub/Sub模型进行消费。当然,Partition模型也不全是优点,其最大的限制在于Partition数量是固定的(虽然可以调整),且只可以分配给其中一个消费者。当消费者的数量大于Partition数量时,这些多出来的消费者将无法消费到消息。一些消息中间件对此进行了优化,例如rocketmq,支持单个partition的并行消费。即在对单个消费者内,同时启动多个线程,来消费这个Partition中的数据,当然前提是要求消息不是有序的,对于有序的消息,只能使用一个线程按顺序消费这个Partition中的数据。

4、Transfer模型

Paritition模型中的消费者组概念很有用,同一个Topic下的消息可以由多个不同业务方进行消费,只要使用不同的消费者组即可,不同消费者组消费到的位置单独记录,互不影响。 但是,Paritition模型还是限制了消费者数量不能多于分区数。因此,又有了另外一种消费模型,笔者称之为Transfer模型,如下图所示:

生产者还是将消息发送到Topic中,针对一个Topic,可以创建多个通道,这里称之为channel。与分区不同的是,发送到Topic中的每条消息,都会转发到每个channel,因此每个channel都有这个Topic的全量数据。当然,没有必要把真的把消息体完整的拷贝一份到channel中,可以只记录一下消息元数据,表示有一条放到这个channel中了。消费者在消费消息时,必须指定从哪个channel消费。多个消费者消费同一个channel时,每条消息只会有一个消费者消费达到,这一点与PTP模型类似。事实上,我们可以认为,消费了同一个channel的消费者,就自动组成了一个消费者组。但是,与Partition模型不同的是,这里没有分区的概念,因此消费者的数量可以是任意的。事实上,GO语言编写的NSQ消息中间件,采用的就是这种模型。当然,这种模型与PTP一样,也不能保证被消息有序,除非通过类似于”专用消费者”的概念。

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

ux、缓存、消息中间件、源码等相关面试题。**

[外链图片转存中…(img-VHQfLHPf-1651030989009)]

java基础案例教程课后答案,华为财经2022春招面试相关推荐

  1. java基础案例教程课后答案,终于有人把Java程序员必学知识点全整理出来了

    前言 微架构的出现,很好地适应了这个时代对快速发展变化的要求.它不再提倡一体化的项目设计,而是对项目进行有效的"业务区"(可以简单理解为不同的子系统〉划分,并利用合理的技术对业务性 ...

  2. 张伟计算机基础案例教程课后答案,案例-大学计算机基础.doc

    案例-大学计算机基础 <大学计算机基础>课程组文件 [2008年2号] 报送:冯老师 关于修改课程教学提问和应用案例的安排 各位老师: 根据前阶段老师们的努力,课程的教学设问和应用案例撰写 ...

  3. python3程序设计基础答案刘德山_北京大学出版社《Java程序设计案例教程》答案【python程序设计案例教程微课版答案】...

    北京大学出版社<Java程序设计案例教程>答案 哎,我也在找不过时北京交通大学出版的 求大学python3程序设计基础答案 刘德山主编 网上找不到 希望大家帮帮忙 答案我也没有,如果你是计 ...

  4. Java基础案例教程思维导图

    Java基础案例教程目录

  5. 计算机应用基础案例教程习题答案,计算机应用基础案例教程

    包杰军等编著的<计算机应用基础案例教程>以培养职业能力为目标,本着"做学合一"."理论与实践并行"."知识与技能并重"的教育思想 ...

  6. 计算机应用基础案例教程答案,计算机应用基础案例教程问答题答案.doc

    <计算机应用基础案例教程>问答题答案 第一章 信息技术与计算机文化 1.计算机的发展经历了哪几个阶段?各阶段的主要特点是什么? 答:电子计算机的发展已经历了四个明显的阶段(也称为四代),正 ...

  7. 计算机应用基础案例教程习题答案,新编计算机应用基础案例教程上机指导与习题集(朱尽蓉)-习题答案...

    新编计算机应用基础案例教程上机指导与习题集( 习题参考答案 第一部分 上机指导与习题集 第1章 计算机基础知识与系统组成 一. 选择题 (一)单选题 1.A 2.B 11.B 12.C 3.C 13. ...

  8. 计算机应用基础案例教程习题答案,新编计算机应用基础案例教程上机指导与习题集(朱尽蓉)-习题答案.doc...

    新编计算机应用基础案例教程上机指导与习题集(朱尽蓉)-习题答案 习题参考答案 第一部分 上机指导与习题集 第1章 计算机基础知识与系统组成 一. 选择题 (一)单选题 1.A2.B3.C4.D5.B6 ...

  9. java基础案例教程答案,2021最新版!

    一面 1.你觉得项目中用了MQ给你带了什么好处,设计初衷是什么?会带来什么缺点嘛? (项目针对性比较强,不细说) 2.在网页键入taobao.com,到返回一个页面,这期间都发生了什么? 3.你说到了 ...

最新文章

  1. ClickHouse系列教程二:使用航班飞行数据
  2. Eclipse快捷键归纳及整理
  3. java 中while编译之后_从APK反编译的Java-while循环什么也不做
  4. 域用户的登录过程和GC的关系
  5. Leetcode周赛5827. 检查操作是否合法
  6. java中的servlet是线程安全的嘛_Java面试题:Servlet是线程安全的吗?(转)
  7. 【python】利用python的tkinter-canvas函数绘制哆啦A梦过程详解(附源码)
  8. MySQL Cluster 用户权限共享 (各sql节点同步)
  9. Linux下的常用软件列表
  10. android 编译 sdl,SDL编译 - Android本地视频播放器开发_Linux编程_Linux公社-Linux系统门户网站...
  11. python获取本地时间并向服务器发送udp报文_python3通过udp实现组播数据的发送和接收操作...
  12. oc21--super
  13. python学习(十八)爬虫中加入cookie
  14. 在互联网大厂,我月入过万,合租却让我落泪
  15. C语言之CoCo去过的城市
  16. 【opencv-python】 cv2.subtract(...)图片减法
  17. css 手型 没生效,css各种手型集合(css禁止手型)(示例代码)
  18. 解决使用CSV包,将写入字符串写入csv文件时字符串被拆分成很多单元的问题
  19. 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)
  20. (转)gallary和imageswitcher

热门文章

  1. 敬畏崛起,王自如的传奇人生
  2. java 大数据处理之内存溢出解决办法
  3. 计算机网络知识总结:ip地址、分类及什么样的ip主机地址可以分配给主机使用
  4. Debian安装redis
  5. ShareSDK移动APP社会化分享组件
  6. python中mainloop什么意思_Tkinter中的mainloop应该如何理解?
  7. 小白成长之路-linux定时任务cron和crontab
  8. 吉大计算机学院课外八学分,西安交通大学本科“课外8学分”实施办法
  9. 485之modbus通讯协议学习笔记
  10. 少年你骨骼精奇?AI现在可以帮你看一看了