Mq(消息队列)message queue
消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前主流kafka、RocketMQ
原理:
一发一存一消费
应用场景:
系统解耦、异步通讯、流量削峰。除此之外,还有延迟通知、最终一致性保证、顺序消息、流式处理等等。
RPC的通信模型
服务提供者(provider)——RPC——服务调用者(consumer)
MQ的通信模型
生产者(producer)—RPC—队列(queue)—RPC—消费者(consumer)
消费者怎么得到消息队列的数据?
生产者将数据放到消息队列中,消息队列有数据,主动叫消费者去拿(俗称push)
消费者不断去轮巡消息队列,看看有没有新的数据,如果有就消费(俗称pull)
Jms消息服务
Jms(java message service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。
jms标准中,两种消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)
P2P:消息队列(Queue),发送者(Sender),接收者(Receiver)
每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中);发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
Pub/Sub模式
包含三个角色主题(Topic),发布者(Publisher),订阅者(Subscriber) 多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者
SOA:面向服务编程
什么是Socket?
Socket(套接字),用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求或者应答网络请求!Socket是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含了进行网络通信所必须的五种信息:连接所使用的协议;本地主机的IP地址;本地远程的协议端口;远地主机的IP地址以及远地进程的协议端口
RPC和Http的区别:
RPC:Remote Produce Call远程过程调用,类型的还有RMI。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型
RPC的框架:webservie(cxf)、dubbo
RMI的框架:hessian
Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。客户端游览器与服务端通信基本都是采用http协议
http实现技术:HttpClient
相同点:底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用
优点:RPC方式更加透明,对用户更方便。Http方式更灵活,没有规定API和语言,跨语言、跨平台
缺点:RPC方式需要在API层面进行封装,限制了开发的语言环境
RPC通信步骤:
- 建立通信
- 服务寻址
- 网络传输(序列化、反序列化)
- 服务调用
分布式事务
分布式事务目前主流四种解决方案
1)、两阶段提交(2pc)
两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务
首先进行准备阶段进行准备,协调者询问参与者事务是否执行成功,参与者发回事务执行结果。若执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。
存在问题:
- 同步阻塞 所有事务参与者等待其他参与者响应都是同步阻塞状态
- 单点问题 协调者在2PC中很重要,发生故障无法完成
- 数据不一致 因网络问题参与者部分提交
- 没有完善的容错机制
2)、补偿事务(TCC)
TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作
3)、本地消息表(异步确保)
本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
之后将本地消息表中的消息转发到 Kafka 等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作
4)MQ 事务消息
LDAP是Lightweight Directory Access Protocol(轻量级目录访问协议)的缩写,特指基于X.500的目录访问协议的简化版,运行在TCP/IP或者其他的面向连接的传输服务之上
ES: ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单
.msi msi是microsoft installer的简写,是微软格式的安装包
.exe 可执行文件(dos中.com也是可执行文件)
JVM是什么?
JVM它是Java Virtual Machine 的缩写,主要是通过在实际计算机模仿各种计算机功能来实现的,组成部分包括堆、方法区、栈、本地方法栈、程序计算器等部分组成的,其中方法回收堆和方法区是共享区,也就是谁都可以使用,而栈和程序计算器、本地方法栈区是归JVM的。Java能够被称为“一次编译,到处运行”的原因就是Java屏蔽了很多的操作系统平台相关信息,使得Java只需要生成在JVM虚拟机运行的目标代码也就是所说的字节码,就可以在多种平台运行。
JRE、JVM、JDK三者的关系是什么
JDK是Java程序员常用的开发包、目的就是用来编译和调试Java程序的。JRE是指Java运行环境,也就是我们的写好的程序必须在JRE才能够运行。JVM是Java虚拟机的缩写,是指负责将字节码解释成为特定的机器码进行运行,值得注意的是在运行过程中,Java源程序需要通过编译器编译为.class文件,否则JVM不认识
nginx是什么?有什么用?
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
- 作为 Web 服务器
- 作为负载均衡服务器
- 作为邮件代理服务器
MVC框架
经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式
Redis:remote dictionary server,即远程字典服务,是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库
数据类型:
String(字符串)
List(列表)
Set (集合)
Hash(哈希)
zset (有序集合)
事务的四个特性是什么
事务,一般是指要做的或所做的事情。事务应该具有4个属性:原子性、一致性、隔离性、持久性