1.1、MQ的基本概念什么是MQMQ(message queue),从字面意思上看就个先入先出的队列,只不过队列中存放的内容是 message 而已,它是一种具有接收数据、存储数据、发送数据等功能的技术服务。
在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务,用于上下游传递消息。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务为啥要用MQ常见的MQ消息中间件有很多,例如ActiveMQ、RabbitMQ、Kafka、RocketMQ等等。那么为什么我们要使用它呢?因为它能很好的帮我解决一些复杂特殊的场景:1️⃣ 高并发的流量削峰举个例子,假设某订单系统每秒最多能处理一万次订单,也就是最多承受的10000qps,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。
2 ...
一、概念Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。
(1)Kafka的特性
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
可扩展性:kafka集群支持热扩展
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
高并发:支持数千个客户端同时读写
(2)Kafka场景应用
日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
消息系 ...
垃圾回收如何确定对象已死通常,判断一个对象是否被销毁有两种方法:
引用计数算法:为对象添加一个引用计数器,每当对象在一个地方被引用,则该计数器加1;每当对象引用失效时,计数器减1。但计数器为0的时候,就表白该对象没有被引用。
可达性分析算法:通过一系列被称之为“GC Roots”的根节点开始,沿着引用链进行搜索,凡是在引用链上的对象都不会被回收。
就像上图的那样,绿色部分的对象都在GC Roots的引用链上,就不会被垃圾回收器回收,灰色部分的对象没有在引用链上,自然就被判定为可回收对象。
垃圾回收算法标记–清除算法见名知义,标记–清除算法就是对无效的对象进行标记,然后清除。
复制算法标记–复制算法就是把Java堆分成两块,每次垃圾回收时只使用其中一块,然后把存活的对象全部移动到另一块区域。
标记–整理算法标记–整理算法算是一种折中的垃圾收集算法,在对象标记的过程,和前面两个执行的是一样步骤。但是,进行标记之后,存活的对象会移动到堆的一端,然后直接清理存活对象以外的区域就可以了。这样,既避免了内存碎片,也不存在堆空间浪费的说法了。但是,每次进行垃圾回收的时候,都要暂停所有的用户 ...
设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
创建型模式工厂方法、抽象工厂、生成器、原型、单例
1.工厂模式工厂模式是Java中最常用的设计模式之一,他提供了一种创建对象的方式,使得创建对象的过程分离,到达解耦的效果。
通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在业务代码中直接实例化对象,这样可以提高代码的可维护性和可拓展性。
工厂模式的类型
简单工厂模式(Simple Factory Pattern):
简单工厂模式不是一个正式的设计模式,但它是工厂模式的基础。它使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象。
工厂方法模式(Factory Method Pattern):
工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。
抽象工厂模式(Abstract Factory Pa ...
简介Redis的场景:数据库DB、缓存Cache、消息队列MQ
产生原因:
Mysql的技术瓶颈:磁盘IO,速度慢
Redis:支持从内存读取数据
Redis支持的数据结构
字符串String
列表Lsit
集合Set
有序集合SortedSet
哈希Hash
消息队列Stream
地理空间Geospatial
HyperLogLog
位图Bitmap
位域Bitfield
使用方式(命令行、API、图形化界面)
CLI(Command Line Interface)
API(Application Programming Interface)
GUI(Graphical User Interface)
Redis的优势
性能高
数据类型丰富,单键值对最大支持512MB大小的数据
简单易用,支持所有主流编程语言
支持数据持久化、主从复制、哨兵模式等高可用特性
Redis 为什么这么快?Redis 内部做了非常多的性能优化,比较重要的有下面 3 点:
Redis 基于内存,内存的访问速度比磁盘快很多;
Redis 基于 Reactor 模式设计开发了一套高效的事件处理模 ...
MySQL数据持久化不要将数据储存在容器中,这也是 Docker 官方容器使用技巧中的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。为了避免数据丢失,用户可以使用数据卷挂载来存储数据,从而实现数据持久化。
示例代码:
12345678910CODEdocker run --name my_mysql -p 3307:3306 --restart unless-stopped -v /e/Docker/mysql/logs:/var/log/mysql -v /e/Docker/mysql/data:/var/lib/mysql -v /e/Docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql
空目录映射
初始数据目录映射, 必须确保是空目录
Win7选项
最后追加 –innodb-use-native-aio=0
非必须映射
日志文件目录与配置文件目录映射是可选的
–restart 选项说明
–restart=always表示容器退出时,docker ...
1 什么是 DockerWindows10 Docker安装详细教程Win10安装DockerDocker教程
1.1 简介
Docker是一个开源的应用容器引擎
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
1.2 应用场景
Web应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
1.3 Docker 的优势1、简化程序:Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。2、避免选择恐惧症:如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可 ...
分层领域模型规约:《阿里巴巴Java开发规范》关于领域模型的部分介绍如下
DO(Data Object):此对象的属性与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
BO(Business Object):业务对象,由 Service 层输出的封装业务逻辑的对象。
AO(ApplicationObject):应用对象,在Web层与Service层之间抽象的复用对象模型, 极为贴近展示层,复用度不高。
VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。
领域模型命名规约:
数据对象:xxxDO,xxx即为数据表名
数据传输对象:xxxDTO,xxx为业务领域相关的名称。
展示对象:xxxVO,xxx一般为网页名称。
POJO是DO/DTO/BO/VO的统称,禁止命名成xx ...
数据对象模型在Java中,VO、PO、DTO都是常用的数据对象模型。
VO(Value Object)是值对象,通常用于表示一个业务实体或者页面展示的内容。VO通常包含了多个属性,并且这些属性的类型和名称与业务相关。VO并不一定与数据库中的表结构相同,也不一定包含所有的属性。VO的作用主要是在不同层之间传递数据,例如在Controller和Service之间传递参数。
PO(Persistent Object)是持久化对象,通常用于表示数据库中的表结构以及与之对应的实体类。PO通常包含了多个属性和对应的getter/setter方法,属性的类型和名称与表结构相对应。PO的作用主要是用于数据访问层,将数据库中的数据映射为Java对象,方便程序对数据的操作。
DTO(Data Transfer Object)是数据传输对象,通常用于在不同服务或进程之间传输数据。DTO通常包含了多个属性,属性的类型和名称与DTO所传输的数据相关。DTO的作用主要是在分布式系统中,通过网络传输数据,减少因网络传输而带来的性能损失。
需要注意的是,在应用程序开发中,VO、PO、DTO这三种对象模型的具 ...