- 博客(29)
- 收藏
- 关注
原创 服务端接口设计原则
经常客户端同学要你改接口,说你设计的接口能不能这样改一下,或那样改一下,这时你甩出这张图,回怼:“不行,这违反了我接口设计原则!”。欢迎同学补充。
2021-04-17 18:06:41 328 1
原创 skynet热更方式总结
skynet因为require有缓存,不能像如下方式热更:package.loaded[module] = nilrequire(module)虽然可以如下这样清下缓存:local cache = require "skynet.codecache"cache.clear()但是这样的成本比较大。只更新一个脚本,却把所有脚本的缓存清了。skynet的DebugConsole服务提供一个更新service的方法:inject。inject address script 将 script 名
2020-11-16 21:22:25 1289
原创 NATS中文开发文档:监控连接
管理与服务器的交互主要是客户机库的工作,但大多数库也提供了一些对幕后发生的事情的了解。例如,客户端库可以提供一种机制来获取连接的当前状态:nc, err := nats.Connect("demo.nats.io", nats.Name("API Example"))if err != nil { log.Fatal(err)}defer nc.Close()getStatu...
2020-03-29 15:54:26 1394
原创 NATS中文开发文档:发送消息
NATS使用包含目标主题、可选回复主题和字节数组的协议发送和接收消息。有些库可以提供帮助程序来将其他数据格式转换为字节或从字节转换为字节,但是NATS服务器将把所有消息视为不透明的字节数组。所有的NATS客户机都是为了简化消息的发送。例如,要将字符串“All is Well”作为UTF-8字节字符串发送到“updates”主题,您需要执行以下操作:nc, err := nats.Connect...
2020-03-29 15:27:16 1239
原创 NATS中文开发文档:接收消息
通常,应用程序可以异步或同步接收消息。使用NAT接收消息依赖于库的实现。一些语言,如Go或Java,提供同步和异步api,而另一些语言可能只支持一种类型的订阅。在所有情况下,订阅过程包括让客户端库告诉NATS系统应用程序对某个特定主题感兴趣。当应用程序完成订阅时,它会取消订阅,告诉服务器停止发送消息。客户端将为每个匹配的订阅接收一条消息,因此,如果连接具有使用相同或重叠主题(例如foo和&g...
2020-03-29 11:06:00 1463 1
原创 NATS中文开发文档:自动重连
出于任何原因断开连接,大多数(如果不是全部)客户端库将重新连接到NATS系统。重新连接逻辑可能因库而异,因此请查看客户端库的文档。通常,客户机将尝试通过connect调用中提供的url或NATS系统在早期连接期间提供的url,重新连接到它所知道的服务器。此功能允许NATS应用程序和NATS系统本身进行自我修复和重新配置,而无需其他配置或干预。该库可以有几个选项来帮助控制重新连接行为、通知重新连接...
2020-03-28 22:41:47 1640 1
原创 NATS中文开发文档:连接
NATS系统通常由一个带有nats或tls协议的标准URL标识,例如nats://demo.nats.io。NATS系统可以是单个服务器、小型集群或全局超级集群。在这些示例中,我们将依赖nats.io提供的单个测试服务器,位于nats://demo.nats.io,使用4222作为默认端口。NATS还支持通过TLS协议使用安全连接。大多数客户端支持使用URL协议tls自动检测安全连接。在tls:...
2020-03-28 16:49:17 2134
翻译 NATS中文文档:序列号
一对多消息的一个常见问题是,由于网络故障,消息可能丢失或丢弃。解决这种情况的一个简单模式是在消息中包含序列id。接收者可以检查序列id以查看是否遗漏了任何内容。在没有新数据的情况下,序列号与心跳信号结合,形成了一个强大而有弹性的模式来检测丢失。存储和持久化消息的系统也可以解决这个问题,但有时会对手头的问题造成过大的破坏,并且通常会导致额外的管理和操作成本。为了真正利用序列id,需要记住以下几点:...
2020-03-26 12:24:57 284
翻译 NATS中文文档:消息回复
在一个最多只有一次语义的系统中,有时会丢失消息。如果您的应用程序正在执行请求-答复,它应该使用超时来处理任何网络或应用程序故障。对请求设置超时并使用处理超时的代码总是一个好主意。发布事件或数据流时,确保消息传递的一种方法是将其转换为带有确认消息(ACKs)概念的请求-答复。在NATS中,ACK可以是一个空消息,一个没有有效负载的消息。因为ACK可以是空的,它可以占用很少的网络带宽,但是ACK的思...
2020-03-26 12:23:48 745
原创 NATS中文文档:队列组
NATS提供了一个内置的负载平衡特性,称为分发队列。使用队列订阅服务器将在一组订阅服务器之间平衡消息传递,这些订阅服务器可用于提供应用程序容错和扩展工作负载。若要创建队列订阅,订阅服务器将注册队列名称。具有相同队列名称的所有订阅服务器构成队列组。这不需要配置。在发布注册主题的消息时,将随机选择组中的一个成员来接收消息。尽管队列组有多个订阅服务器,但每个消息仅由一个使用。队列组名称遵循与主题相同...
2020-03-26 12:21:53 782
原创 NATS中文文档:请求与应答
请求-应答是现代分布式系统中常见的一种模式。一个请求被发送,应用程序要么等待具有特定超时的响应,要么异步接收响应。现代系统日益复杂,要求具有位置透明、上下缩放、可观测性等特性。许多技术需要额外的组件、sidecars模式和代理来完成完整的功能集。NATS以其核心通信机制publish和subscribe支持这种模式。一个请求被发布到一个给定的主题上,并带有一个应答主题,响应者监听该主题并将响应发...
2020-03-26 12:21:26 750
原创 NATS中文文档:发布与订阅
NATS实现了一个一对多通信的发布-订阅消息分发模型。发布者发送有关某个主题的消息,而侦听该主题的任何活跃的订阅服务器都将接收该消息。订阅者还可以注册感兴趣的有通配符主题,这些主题的工作方式有点像正则表达式(仅有一点像)。这种一对多的模式有时称为扇出。通过浏览pub-sub教程,使用live服务器,尝试自己使用NATS发布订阅。...
2020-03-26 12:21:03 470
原创 NATS中文文档:基于主题的消息传递
本质上,NATS就是消息的发布和监听。这两者在很大程度上都依赖于将消息映射为流或话题的主题。简单来说,主题只是一个字符串,作为发布者和订阅者可以用来查找彼此的名称。NATS服务器保留了一些特殊的字符,规范规定在主题名中只能使用“字母数字”和“.”。主题区分大小写,不能包含空格。为了跨客户端的安全起见,应该使用ASCII字符,尽管将来可能会有所更改。主题层次结构这个.字符用于创建主题层次结构。...
2020-03-26 12:20:32 695
原创 NATS中文文档:什么是NATS
NATS消息传递允许在计算机应用程序和服务之间交换分割为消息的数据。这些消息由主题寻址,不依赖于网络位置。这在应用程序或服务和底层物理网络之间提供了一个抽象层。数据被编码和以帧作封装为消息并由发布者发送。消息由一个或多个订阅者接收、解码和处理。NATS使程序能够轻松地跨不同的环境、语言、云提供商和本地系统进行通信。客户端通常通过一个URL连接到NATS系统,然后对主题进行订阅或发布。通过这种简单...
2020-03-26 12:19:08 3902
原创 三分钟读懂ZeroMQ
为什么需要ZeroMQZeroMQ可以分开来看Zero MQ,MQ就是Message Queue消息队列。Zero是零,它代表零中间件(None-Broker)、零延迟,同时,它又有了新的含义:零管理、零成本、零浪费。总的来说,零表示最小、最简,这是贯穿于该项目的哲理。致力于减少复杂程度,提高易用性。消息队列有四个典型应用场景:异步处理:任务并行,减少响应时间应用解耦:无上下文,无状态,...
2020-03-23 19:34:56 2307
原创 go语言:给map上锁
map不是goroutine safe的,在多goroutine并发时需要上锁。不上锁会出现什么问题呢?资源竞争:会出现脏读,丢失更新等一系列状况。如读到的是旧数据或是读出来的对象已经被删除了,引发panic。锁用的不对会发生什么呢?第一种情况:死锁(dead lock),卡住。使用时lock了,但没有unlock,就锁死了。另外,注册copy对象里带锁时,注意是不是带锁状态一起拷贝了,...
2020-03-01 12:30:10 1889
原创 go语言:内嵌二义性(ambiguous selector )
内嵌两个结构体中有相同字段会发生二义性。先看代码:package mainimport "fmt"type Shape struct { id int}type Object struct { id int}type Color struct { //Object id int}type Rect struct { Shape *Color}fu...
2020-03-01 12:20:00 1346
原创 go语言:带缓冲和不带缓冲通道的区别
不带缓冲的通道这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操作。package mainimport ( "fmt" "time")func main() { c := make(chan int, 0) go func() { defer func() { fmt.Println("recycle")...
2020-03-01 12:18:45 410
原创 游戏微服务架构设计:io游戏
什么是io游戏,就是一类的开房间小游戏。如《野蛮人大作战》。这种游戏怎么做分布式?Gate这个连接用来做负载均衡,只是为了获取连接服的连接地址用,客户端连接后,拿到连接服的IP和端口就断开。其中,如何选择连接服的策略可以是随机、轮询、加权重等。Connector连接服:每一个用户一个连接,连接绑定用户的ID。主要由它发起其它服务的RPC,代客户端向后台请求服务。Lobby大厅:登入...
2020-02-29 18:43:16 474
原创 游戏微服务架构设计:挂机类游戏
挂机类游戏如何做分布式?游戏分五类节点设计:Gate这个连接用来做负载均衡,只是为了获取连接服的连接地址用,客户端连接后,拿到连接服的IP和端口就断开。其中,如何选择连接服的策略可以是随机、轮询、加权重等。Connector连接服:每一个用户一个连接,连接绑定用户的ID。主要由它发起其它服务的RPC,代客户端向后台请求服务。Login登入服:做登入验证,账号相关的一切服务。Use...
2020-02-29 18:42:30 522
原创 游戏微服务架构设计:棋牌游戏
棋牌游戏怎么做分布式?Gate这个连接用来做负载均衡,只是为了获取连接服的连接地址用,客户端连接后,拿到连接服的IP和端口就断开。其中,如何选择连接服的策略可以是随机、轮询、加权重等。Connector连接服:每一个用户一个连接,连接绑定用户的ID。主要由它发起其它服务的RPC,代客户端向后台请求服务。Lobby大厅:登入直接在这里做了,单独起个Login节点做登入验证也可以,但是觉...
2020-02-29 18:41:31 870
原创 游戏微服务架构设计:MMORPG
有同学想做MMORPG,不知道怎么做分布式,下面是我的思考,抛砖引玉。首先,微服务下不是服务分的越细越好,只要独立可共享的业务适合做成微服务,比如支付。不光项目内用,还可以和其它项目共用。避免重复开发。如上设计分成五个节点服务。分别介绍:Gate这个连接用来做负载均衡,只是为了获取连接服的连接地址用,客户端连接后,拿到连接服的IP和端口就断开。其中,如何选择连接服的策略可以是随机、轮询、...
2020-02-29 18:40:19 1142 1
原创 游戏微服务架构设计:异步回调
在处理客户端请求时,需要立即返回,把一些工作交给后台线程执行时,就会需要用到异步回调。在node.js中使用async很美,例如:async.waterfall([ function(callback) { callback(null, 'one', 'two'); }, function(arg1, arg2, callback) { //...
2020-02-29 14:58:33 466
原创 游戏微服务架构设计:etcd
为什么是etcd服务发现解决方案有很多,为什么不是zookeeper,consul等。马蜂窝技术做了个压测:可以发现,etcd性能稳定,资源占用最少。此外,etcd相比其它还使用简单,部署方便。而且也是go开发的,同源。服务发现etcd不是一个高可用的分布式键值(key-value)数据库吗?它是怎么实现服务发现的?实现机制是这样的:服务节点可以在etcd中注册服务名和节点地址,并且...
2020-02-23 21:23:32 465
原创 分布式游戏开发:js的Number与go的int64转换
开发分布式游戏在许多地方会用到唯一ID。使用int64类型相比字符串的优点是方便索引,这样比较高效。比如在kudos框架开发的游戏中,玩家ID和session的ID,游戏中的实例ID都使用的int64类型。但是在与js的通信时,int64转成Number时就会丢失精度。这是一个坑,推荐的解决办法是转成字符串传输。因为Javascript的Number存储使用了IEEE 754中规定的双精度浮...
2020-02-22 17:32:08 773
原创 游戏微服务架构设计:连接的负载均衡
游戏设计时,如果只有一个登入服,当连接数上来的话,登入服务器肯定难以重负,直接崩溃宕机。所以设计多个登入服务器来分担负载是很有必要的。传统模式创建一个网关服务器,里面存储所有连接服的地址信息。通过轮询或其它算法返回连接服的地址。这样,游戏先访问网关,拿到连接服的地址后,再连接该服务器,登入游戏。如下图:缺点:如果连接服挂了一个,或是添加了一个连接服connector,都需要重启一下gate...
2020-02-22 17:28:47 773
原创 kudos性能是pomelo的5倍
本测试与pomelo进行了横项对比。kudos: https://github.com/kudoochui/kudos测试硬件macbook pro:cpu: 2.7 GHz Intel Core i5内存: 8 GB 1867 MHz DDR3测试场景起一个连接同时发10000个包。包的内容是{Words:“kudoo”},服务端响应{Words:“hello kudoo”...
2020-02-15 16:59:49 933
原创 开源一个服务端游戏开发框架
本人也是因为go的魅力从原来的node.js转go开发的,但并没有放弃node.js开发。node.js开发起来极为舒服,谁用谁知道。go的性能,并发,静态编译速度还是更令人着迷,在云计算,区块链等未来领域的发展也是极为看好。之前游戏开发所使用的是网易的pomelo框架,它应该是游戏开发中node.js领域的主流框架。pomelo使用过程中遇到几个痛点:性能提升:pomelo适合做IO密集型...
2020-02-14 11:55:37 1052
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人