寻找客户资源的网站,外贸网站制作需求,新网站开发费用,宁波seo推荐优化在一个基于分布式的游戏服务器系统中#xff0c;不同的服务器之间#xff0c;哪种通信方式是不可行的#xff08;#xff09;#xff1f;
A管道
B消息队列
C高速缓存数据库
D套接字
首先看到这道题我是懵逼的#xff0c;我们分别介绍一下各个的概念
管道为运行在同…在一个基于分布式的游戏服务器系统中不同的服务器之间哪种通信方式是不可行的
A管道
B消息队列
C高速缓存数据库
D套接字
首先看到这道题我是懵逼的我们分别介绍一下各个的概念
管道为运行在同一个JVM中的两个线程提供了通信的能力。
在java中通信的双方应该是运行在同一进程中的不同线程。
Java提供管道功能实现管道通信的类有两组PipedInputStream和PipedOutputStream或者是PipedReader和PipedWriter。管道通信主要用于不同线程间的通信。
一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道。PipedOutputStream向管道中写入数据PipedIntputStream读取PipedOutputStream向管道中写入的数据。一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据。
Java NIO 管道是 2 个线程之间的单向数据连接。Pipe有一个 source 通道和一个 sink 通道。数据会被写到 sink 通道从 source 通道读取。
这里是 Pipe 原理的图示
创建管道
通过Pipe.open()方法打开管道。例如
Pipe pipe Pipe.open(); 向管道写数据
要向管道写数据需要访问 sink 通道。像这样
Pipe.SinkChannel sinkChannel pipe.sink();
通过调用 SinkChannel 的write()方法将数据写入SinkChannel, 像这样
String newData New String to write to file... System.currentTimeMillis();
ByteBuffer buf ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {sinkChannel.write(buf);
}
从管道读取数据
从读取管道的数据需要访问 source 通道像这样
Pipe.SourceChannel sourceChannel pipe.source();
调用 source 通道的read()方法来读取数据像这样
ByteBuffer buf ByteBuffer.allocate(48);
int bytesRead sourceChannel.read(buf);
read()方法返回的 int 值会告诉我们多少字节被读进了缓冲区。
对于管道有下面这几种类型
①普通管道PIPE通常有两种限制一是单工即只能单向传输二是血缘即常用于父子进程间或有血缘关系的进程间。
②流管道s_pipe去除了上述的第一种限制实现了双向传输。
③命名管道name_pipe去除了上述的第二种限制实现了无血缘关系的不同进程间通信。
显然要求是对于不同的服务器之间的通信是要要求全双工形式的而管道只能是半双工虽然可以双向但是同一时间只能有一个方向传输全双工和半双工的区别可以如下图示理解 Java消息服务Java Message ServiceJMS应用程序接口是一个Java平台中关于面向消息中间件MOM的API用于在两个应用程序之间或分布式系统中发送消息进行异步通信。 点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)
消息队列
一、定义
JMS规范目前支持两种消息模式点对点point to point queue和发布/订阅publish/subscribetopic
1.1、点对点Queue队列不可重复消费
消息生产者生产消息发送到queue中然后消息消费者从queue中取出并且消费消息。 消息被消费以后queue中不再有存储所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者但是对一个消息而言只会有一个消费者可以消费。 1.2、发布/订阅Topic主题可以重复消费
消息生产者发布将消息发布到topic(主题)中同时有多个消息消费者订阅消费该消息。和点对点方式不同发布到topic的消息会被所有订阅者消费。
支持订阅组的发布订阅模式 发布订阅模式下当发布者消息量很大时显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅这样订阅者很容易实现消费能力线性扩展。可以看成是一个topic下有多个Queue每个Queue是点对点的方式Queue之间是发布订阅方式。
2、区别
2.1、点对点模式
生产者发送一条消息到queue一个queue可以有很多消费者但是一个消息只能被一个消费者接受当没有消费者可用时这个消息会被保存直到有 一个可用的消费者所以Queue实现了一个可靠的负载均衡。
2.2、发布订阅模式
发布者发送到topic的消息只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅当你发布一个消息所有订阅这个topic的服务都能得到这个消息所以从1到N个订阅者都能得到这个消息的拷贝。
3、流行模型比较
传统企业型消息队列ActiveMQ遵循了JMS规范实现了点对点和发布订阅模型但其他流行的消息队列RabbitMQ、Kafka并没有遵循JMS规范。
RabbitMQ
RabbitMQ实现了AQMP协议AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue消费端根据queue名称消费消息。 RabbitMQ既支持内存队列也支持持久化队列消费端为推模型消费状态和订阅关系由服务端负责维护消息消费完后立即删除不保留历史消息。
1点对点 生产端发送一条消息通过路由投递到Queue只有一个消费者能消费到。
2多订阅 当RabbitMQ需要支持多订阅时发布者发送的消息通过路由同时写到多个Queue不同订阅组消费不同的Queue。所以支持多订阅时消息会多个拷贝。
Kafka
Kafka只支持消息持久化消费端为拉模型消费状态和订阅关系由客户端端负责维护消息消费完后不会立即删除会保留历史消息。因此支持多订阅时消息只会存储一份就可以了。但是可能产生重复消费的情况。 1点对点多订阅 发布者生产一条消息到topic中不同订阅组消费此消息。
java高速缓存数据库
1.Cache高速缓存 作为个人计算机的日常使用者你肯定听说过这些名词Cache高速缓存、Memory 内存、Hard disk硬盘。它们都是数据存取单元但存取速度却有很大差异呈依 次递减的顺序。对于CPU来说它可以从距离自己最近的Cache高速地存取数据而不是 从内存和硬盘以低几个数量级的速度来存取数据。而Cache中所存储的数据往往是CPU 要反复存取的数据有特定的机制或程序来保证Cache内数据的命中率Hit Rate 。因此CPU存取数据的速度在应用高速缓存后得到了巨大的提高。 对于数据库来说厂商的做法往往是在内存中开辟相应的区域来存储可能被多次存取的 数据和可能被多次执行的语句以使这些数据在下次被访问时不必再次提交对DBMS的请 求和那些语句在下次执行时不必再次编译。 因为将数据写入高速缓存的任务由Cache Manager负责所以对用户来说高速缓存的内容 肯定是只读的。需要你做的工作很少程序中的SQL语句和直接访问DBMS时没有分别返 回的结果也看不出有什么差别。而数据库厂商往往会在DB Server的配置文件中提供与C ache相关的参数通过修改它们可针对我们的应用优化Cache的管理。下图是在Win2K 中配置MS Access数据源的界面在驱动程序部分你可设置的页超时和缓冲区大小就是 和Cache有关的参数。在后面的讨论中我将展示一个更复杂的数据库向你解释Cache 对访问数据库性能的影响和如何寻找最优的配置方案。 2.Connection Pool连接池 池是一个很普遍的概念和缓冲存储有机制相近的地方都是缩减了访问的环节但它 更注重于资源的共享。下图展示了建立调制解调器池以共享调制解调器资源的VPN拨号 方案 对于访问数据库来说建立连接的代价比较昂贵因此我们有必要建立连接池以提 高访问的性能。我们可以把连接当作对象或者设备池中又有许多已经建立的连接访 问本来需要与数据库的连接的地方都改为和池相连池临时分配连接供访问使用结 果返回后访问将连接交还。 JDBC 1.0标准及其扩展中没有定义连接池而在JDBC 2.0标准的扩展中定义了与连接池 相关的接口。与接口对应的类由应用服务器厂商实现你可在对服务器的管理过程中调 节某个数据库连接池的参数。下图简略地描述了连接池的运行机制 套接字
套接字socket为两台计算机之间的通信提供了一种机制在 James Gosling 注意到 Java 语言之前套接字就早已赫赫有名。该语言只是让您不必了解底层操作系统的细节就能有效地使用套接字。多数着重讨论 Java 编码的书或者未涵盖这个主题或者给读者留下很大的想象空间。本教程将告诉您开始在代码中有效地使用套接字时您真正需要知道哪些知识。我们将专门讨论以下问题
什么是套接字 它位于您可能要写的程序的什么地方 能工作的最简单的套接字实现 ― 以帮助您理解基础知识 详细剖析另外两个探讨如何在多线程和具有连接池环境中使用套接字的示例 简要讨论一个现实世界中的套接字应用程序
如果您能够描述如何使用 java.net 包中的类那么本教程对您来说也许基础了点虽然用它来提高一下还是不错的。如果您在 PC 和其它平台上使用套接字已经几年那么最初的部分也许会使您觉得烦。但如果您不熟悉套接字而且只是想知道什么是套接字以及如何在 Java 代码中有效地使用它们那么本教程就是一个开始的好地方。
所以这里选A 我是歌谣欢迎接受你的理解
文章仅个人理解来在各大网站。如有不合理之处欢迎吐槽。
阅读目录置顶)(长期更新计算机领域知识https://blog.csdn.net/weixin_43392489/article/details/102380691
阅读目录置顶)(长期更新计算机领域知识https://blog.csdn.net/weixin_43392489/article/details/102380882
阅读目录置顶)(长期科技领域知识https://blog.csdn.net/weixin_43392489/article/details/102600114
歌谣带你看java面试题 https://blog.csdn.net/weixin_43392489/article/details/102675944