Java游戏服务器基础技术体系

Java游戏服务器基础技术体系

Java基础技术体系

  • Java7,Java8,Java9
    • coin/invokedynamic/g1/nio2/fork-join/
    • Lambda/interface-static-default/function/stream/Nashorn/time
    • Jigsaw/jshell(REPL)/JMH benchmark/进程api/jsonapi/
  • OpenJDK
    • 源代码-最好的代码参考
  • Java内存模型/并发/多线程
    • 内存模型
      • 计算机系统#缓存一致性
        • 每个处理器有自己的高速缓存,他们又共享同一主内存;当多个处理器都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致,那同步到主内存时以谁的缓存数据为准呢
      • 在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象
      • 指令重排序
      • Java内存模型-主内存与工作内存(每条线程有自己的工作内存)
        • 线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝
        • 线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存的变量
        • 不同的线程之间之间也无法直接访问对方工作内存的变量
        • 线程间变量的传递均需要通过主内存来完成
        • lock/unlock/read/load/use/assign/store/write-每一种操作都是原子的,不可再分的(注意double/long)
      • volatile
        • 保证可见性
        • 禁止指令重排序优化-内存屏障
      • 先行发生原则
    • 工作窃取算法(Fork/Join)
    • 原子性、可见性、有序性(如果在本线程内观察,所有操作都是有序的;如果在一个线程中观察另一个线程,所有操作都是无序的)
工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。 那么为什么需要使用工作窃取算法呢?假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应,比如A线程负责处理A队列里的任务。但是有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务等待处理。干完活的线程与其等着,不如去帮其他线程干活,于是它就去其他线程的队列里窃取一个任务来执行。而在这时它们会访问同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从双端队列的头部拿任务执行,而窃取任务的线程永远从双端队列的尾部拿任务执行。工作窃取算法的优点是充分利用线程进行并行计算,并减少了线程间的竞争,其缺点是在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且消耗了更多的系统资源,比如创建多个线程和多个双端队列。 
  • JVM
    • 内存区域
    • gc
    • 工具
    • 调优
  • Class/Bytecode/Classloader
    • hotswap
    • 加载、验证、准备、解析、初始化
    • agent/instrumentation
      • agentmain-jvm启动后可以通过代理做一些事情
      • Instrumentation#redefineClasses,可以重定义class->而非之前实例替换->动态改变JVM已加载的类(这个很强大)
      • 可通过agentmain获得Instrumentation,然后利用Instrumentation去redefineClasses
  • 多语言编程
    • invokedynamic/java.lang.invoke

架构

  • 分布式服务器架构
    • 应用和数据服分离/使用缓存/应用服务器集群/数据库读写分离/反向代理-CDN/分布式文件系统-分布式数据库系统/NoSql-搜索引擎/业务拆分/分布式服务/
    • 分层
      • 横向:应用层、服务层、数据层
      • 纵向:将不同的功能和服务分割,模块化
    • 分布式
      • 将不同的模块部署在不同的机器上,通过远程调用协同工作
    • 集群
      • 将多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务
    • 缓存
      • 本地缓存/分布式缓存/CDN/反向代理
    • 异步
    • 冗余
    • 自动化
    • 架构要素
      • 性能、可用性、伸缩性、扩展性、安全
        • 响应时间、并发数、吞吐量、SystemLoad、对象数与线程数、内存使用、cpu使用、io、性能测试、负载测试、压力测试、稳定性测试
  • mmo游戏服务器架构
    • 分线/分场景
    • 动态的增加或者减少gs
    • 网关可动态的增加或者减少
  • 无缝地图
    • NODE专注场景,OBJ专注玩家对象,GATE专注网络
    • 动态负载均衡
    • 很多无缝动态负载均衡的服务端宣称自己支持无限的人数,但不意味着 MMORPG游戏的人数上限真的可以无限扩充,因为这样的体系会受制于网络带宽和客户端性能。带宽决定了同一个区域最大广播上限,而客户端性能决定了同一个屏幕到底可以绘制多少个角色

模式

  • 架构模式
    • 背景-问题-解决方案
    • Layers模式-分层-网络协议
    • Pipes and Filters-处理数据流
    • Blackboard-一系列独立的程序携手合作,致力于处理同一个数据结构
    • Microkernel
    • Broker
    • MVC/PAC
    • Reflection
    • Whole-Part/Master-Slave/Proxy/Command Processor/View Handler/Forwarder-Receiver/Client-Dispatcher-Server/publisher-subscriber/
    • CounterPointer
    • 抽象、封装、信息隐藏、模块化、分离关注点、耦合与内聚、充分-完整-简单、策略与实现分离、接口与实现分离、单个引用点、分而治之
    • 并发:Reactor/Proactor/Acceptor-Connector/Aysnchronous Completion Token/Active Object/Thread-Speific Storage
    • 资源管理:Loopup/Lazy Acquisition/Caching/Pooling/Resouce Lifecycle Manager/
  • 设计模式
    • 23
  • 面向对象设计原则
    • solid
    • 抽象、解耦、开闭

网络编程/并发编程

  • bio/nio/nio2
  • netty
  • select/poll/epoll/kqueue/iocp/reactor/proactor
  • java.util.concurrent

调优

  • cpu、内存、io
  • jvm调优
  • 内存泄露、死循环

Mysql/NoSql

  • redis
  • mongodb
  • mongodb是一个真正的数据库而,redis更接近于memcache
  • mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据
  • nosql也分类型的;redis、memcached这样的KeyValue天然适合做缓存,相互替代比较容易,优缺点彼此争论不一;mongo属于文档型,介于nosql与关系型数据库之间,相比其他nosql,具有强大的查询语句,在一定程度上可以用来存储海量、需要多条件查询同时又不需要关系型数据库特性的“文档”,反正我用他来存日志

Linux

  • shell
  • vim
  • grep
  • 分析日志文件/启动-关闭脚本
  • top、ps、netstat

开源框架

  • Netty/Disruptor/Vert.x/Kafka/RocketMq/Nginx

Node.js/Go

  • Go-Goroutine
  • Node.js-事件驱动、非阻塞式I/O

前沿技术

  • 微服务

你可能感兴趣的:(Java游戏服务器基础技术体系)