Go语言中文网 为您找到相关结果 54

由Go语言并发模型想到游戏服务器并发

这段时间看了一些Go语言相关的东西,发现Go语言的最大特性并发模型类似于C++里面的线程池,正好我们项目服务器也是用的线程池,记录下。 Go语言的并发单位是语言内置的协程,使用关键字go+函数创建一个新的协程,新创建的协程会自动加入到协程调度上下文的等待调度队列,一个协程调度上下文对应一个线程,一个协程调度上下文对应多个协程。新加入的协程会动态负载到各个调度上下文,如果所有调度上下文的平均负载较高时,总调度器会自动创建新的线程和对应的调度上下文用于工作。整体上看,是N个线程:N个调度上下文:M个协程的关系。 我们项目服务器线程架构使用boost::threadpool作为底层,按照配置设定的线程数量启动threadpool,驱动所有Invoker单元,各个Invoker再驱动持有自己的Ser...阅读全文

博文 2014-10-17 03:00:01 gns3

golang使用Nsq

为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯。一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golang原汁原味的东西,功能齐全,关键是性能还不错。其中支持动态拓展,消除单点故障等特性, 都可以很好的满足我的需求 下面上一张Nsq与其他mq的对比图,看上去的确强大。下面简单记录一下Nsq的使用方法 golang2017开发者大会 Nsq服务端 Nsq服务端简介 在使用Nsq服务之前,还是有必要了解一下Nsq的几个核心组件整个Nsq服务包含三个主要部分 nsqlookupd 先看看官方的原话是怎么说:nsqlookupd是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话...阅读全文

博文 2017-04-24 12:56:37 喵喵小魔王

moonmq: 用go实现的高性能message queue

介绍 moonmq是一个用go实现的高性能消息队列系统,后续准备用于我们消息推送服务以及各个后台的异步任务。 在设计上面,moonmq主要借鉴了rabbitmq以及rocketmq相关的思想,但是做了很多减法,毕竟我不是要设计成一个非常通用的mq。 名词解释 publisher,消息生产者consumer,消息消费者broker,消息中转站queue,消息存储队列 publisher给一个命名的queue发送消息msg,broker负责将msg存放在queue里面。 consumer可以关注自己感兴趣的queue,这样当queue里面有消息的时候,broker就会将该消息推送给该consumer。 推拉模型 在rocketmq里面,支持的是pull msg,而rabbitmq则是支持push...阅读全文

博文 2015-06-18 18:07:58 siddontang

分布式后台任务队列模拟(Golang)

最近研究了下gowoker,这东西代码少而精,Golang真是很适合实现这类东西。 我去掉参数配置,JSON,Redis这些东西,用goworker的方式做了个最简单的实现。 实现如下功能: 1. worker向JobServer注册可执行的功能 2. JobServer轮询,有job就执行,没有则继续轮询 3. client向JobServer提出任务请求,并传入参数 4. JobServer依请求丢给worker执行(可并发或串行执行) 5. JobServer继续轮询 我弄的这个代码很少,其中队列用数组代替,同时省掉了很多东西, 但保留了其goroutine与channel最基础的实现。 如果想看goworker的,可以参考下我这个,应当可以更快的弄明白goworker。 演示例子及运...阅读全文

博文 2015-06-17 20:03:48 xcltapestry

golang轮询机制select的理解

func main() { c := make(chan int) quit := make(chan int) go func() { for i := 0; i < 10; i++ { fmt.Println(<-c) } quit <- 0 }() fibonacci(c, quit) } //select的轮询机制 func fibonacci(c chan int, quit chan int) { x, y := 0, 1 for { select { // select轮询机制 case c <- x: x, y = y, x+y case <-quit: fmt.Println("quit") return } } } main中执行fibonacci函数时候,select有...阅读全文

博文 2015-07-24 16:00:01 webyh

Golang控制goroutine的启动与关闭

最近在用golang做项目的时候,使用到了goroutine。在golang中启动协程非常方便,只需要加一个go关键字: go myfunc(){ //do something }() 但是对于一些长时间执行的任务,例如: go loopfunc(){ for{ //do something repeat } }() 在某些情况下,需要退出时候却有些不方便。举个例子,你启动了一个协程,长时间轮询处理一些任务。当某种情况下,需要外部通知,主动结束这个循环。发现,golang并没有像java那样中断或者关闭线程的interrupt,stop方法。于是就想到了channel,通过类似信号的方式来控制goroutine的关闭退出(实际上并不是真的直接关闭goroutine,只是把一些长时间循环的阻塞...阅读全文

博文 2015-10-11 04:00:00 vimsk

webhook 是什么以及如何创建

我们在网上做的工作,大部分其实就是事件,webhooks 已经成为了连接系统的主要方式,不管是用户创建、支付成功、DockerHub 镜像推送或者 Git 仓库上的合并请求,这些都是非常有用并且轻量级的共享信息的方式 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/webhook/1.png) 那么,webhook 究竟是什么呢?webhook 是应用给其它应用提供实时信息的一种方式。信息一产生,webhook 就会把它发送给已经注册的应用,这就意味着你能实时得到数据。不像传统的 APIs 方式,你需要用轮询的方式来获得尽可能实时的数据。这一点使得 webhook 不管是在发送端还是接收端都非常高效。由...阅读全文

博文 2018-09-25 10:05:16 jettyhan

基于Redis实现的延迟队列

delay-queue 延迟队列, 参考有赞延迟队列设计实现 项目地址 运行 ./delay-queue -c delay-queue.conf 默认监听0.0.0.0:9277 HTTP接口 请求方法 POST 请求Body及返回值均为json 返回值 { "code": 0, "message": "添加成功", "data": null } 参数名 类型 含义 备注 code int 状态码 0: 成功 非0: 失败 message string 状态描述信息 data object, null 附加信息 添加任务 URL地址 /push { "topic": "order", "id": "15702398321", "delay": 3600, "ttr": 120, "body"...阅读全文

博文 2017-07-04 16:04:57 order_c

golang实现权重轮询调度算法(Weighted Round-Robin Scheduling)

最近在看golang连接mysql数据库的例子(Go-MySQL-Driver),但是想到连接数据库肯定会有连接多从库的需求,而且每个从库的权重也会不一样,参考<<权重轮询调度算法(Weighted Round-Robin Scheduling)>>这篇文章写了一个golang版本的权重轮询调度算法,请大家指教,不多说了直接上代码: package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface{}{ 0: {"connectstring": "root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8", "weight": 2}, 1: {"co...阅读全文

博文 2016-11-03 02:00:03 Lancerio

(Go语言)Go的网络轮询及IO机制

创文章,转载请注明出处:服务器非业余研究-sunface 简介 这篇介绍了Go的运行时系统——网络I/O部分。 阻塞 Go语言中,所有的I/O都是阻塞的,因此我们在写Go系统的时候要秉持一个思想:不要写阻塞的interface和代码,然后通过goroutines和channels来处理并发,而不是用回调和futures。其中一个例子是“net/http"包中的http服务器,无论何时当http服务器接收一个连接,它都会创建一个新的goroutine处理来自这个连接的所有请求,这样我们就能写出很清晰的代码:先做什么,然后做什么。然而,不幸的是,操作系统提供的阻塞式I/O并不适合构建我们自己的阻塞式I/O接口(interface)。 在我之前有关Go运行时的文章中,其中一篇介绍了Go调度器如何处...阅读全文

博文 2015-06-17 23:01:52 working_brain

IO模型

一:IO简介Unix(like)中,一切皆文件。Socket、FIFO、管道、终端都是文件,一切都是流。在信息交换的过程中,实际都是对这些流进行的数据收发操作,简称I/O操作(系统调用read、write)。而流有很多,于是就用文件描述符(fd)来区分具体是哪个流。For example,我们创建了一个socket,系统调用会返回一个fd,对socket的任何操作都是对这个fd的操作(隐隐包含着一种分层与抽象的思想)。 二:同步异步、阻塞非阻塞同步与异步是一种通信机制,涉及到调用方和被调用方(针对应用程序与内核而言)。同步过程中,进程触发IO操作并等待(阻塞)或者轮询的(非阻塞)去查看IO操作是否完成;异步过程中,进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通...阅读全文

博文 2018-04-08 18:34:39 this_HD

关于 golang 中使用 ES

需要使用到的包 gopkg.in/olivere/elastic.v6 golang.org/x/elasti 创建一个接口 controllers/base.go package controllers import ( "context" "fmt" "log" "os" "gopkg.in/olivere/elastic.v6" ) var EsClient *elastic.Client var host = "http://127.0.0.1:9200/" func init(){ //es 配置 errorlog := log.New(os.Stdout, "APP", log.LstdFlags) var err error EsClient, err =elastic.New...阅读全文

博文 2019-08-28 17:32:46 顶尖少爷

istio1.0安装教程,快速入门

广告 | kubernetes各版本离线安装包 祝贺istio1.0发布, 在此献上教程一份 安装 安装k8s 强势插播广告 三步安装,不多说 安装helm, 推荐生产环境用helm安装,可以调参 release地址 如我使用的2.9.1版本 yum install -y socat # 这个不装会报错 [root@istiohost ~]# wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz [root@istiohost ~]# tar zxvf helm-v2.9.1-linux-amd64.tar.gz [root@istiohost ~]# cp linux-amd64...阅读全文

博文 2018-08-01 19:34:52 fanux

Go 实现的负载均衡服务器goproxy-server

goproxy是使用golang实现的一个基本的负载均衡服务器,支持缓存(使用redis);反向代理,目前支持6种模式: 随机分发; IP HASH两种模式; 轮询(Round Robin)法; 加权轮询(Weight Round Robin)法; Power of Two Choices (P2C)算法; 边界一致性哈希算法(Consistent Hashing with Bounded Loads)。 另外,对转发的请求有较大的控制度,可以控制代理特定的请求,屏蔽特定的请求,甚至可以重写特定的请求。 另外,有时候项目需要用到第三方的服务并对返回的数据进行自定义修改,调用第三方的API,利用proxy server可以很容易的控制第三方API返回的数据并进行自定义修改...阅读全文

开源项目 2018-07-02 13:30:01 网友

golang使用Nsq

为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯。一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golang原汁原味的东西,功能齐全,关键是性能还不错。其中支持动态拓展,消除单点故障等特性, 都可以很好的满足我的需求 下面上一张Nsq与其他mq的对比图,看上去的确强大。下面简单记录一下Nsq的使用方法图片来自golang2017开发者大会 Nsq服务端 Nsq服务端简介 在使用Nsq服务之前,还是有必要了解一下Nsq的几个核心组件整个Nsq服务包含三个主要部分 nsqlookupd 先看看官方的原话是怎么说:nsqlookupd是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现...阅读全文

博文 2017-04-25 15:00:25 花间隐虎

Go语言 Go的网络轮询及IO机制

创文章,转载请注明出处:服务器非业余研究-sunface 简介 这篇介绍了Go的运行时系统——网络I/O部分。 阻塞 Go语言中,所有的I/O都是阻塞的,因此我们在写Go系统的时候要秉持一个思想:不要写阻塞的interface和代码,然后通过goroutines和channels来处理并发,而不是用回调和futures。其中一个例子是“net/http"包中的http服务器,无论何时当http服务器接收一个连接,它都会创建一个新的goroutine处理来自这个连接的所有请求,这样我们就能写出很清晰的代码:先做什么,然后做什么。然而,不幸的是,操作系统提供的阻塞式I/O并不适合构建我们自己的阻塞式I/O接口(interface)。 在我之前有关Go运行时的文章中,其中一篇介绍了Go调度器如何处...阅读全文

博文 2015-06-17 23:01:53 abv123456789

Golang - 调度剖析【第二部分】

回顾本系列的第一部分,重点讲述了操作系统调度器的各个方面,这些知识对于理解和分析 Go 调度器的语义是非常重要的。在本文中,我将从语义层面解析 Go 调度器是如何工作的,并重点介绍其高级特性。Go 调度器是一个非常复杂的系统,我们不会过分关注一些细节,而是侧重于剖析它的设计模型和工作方式。我们通过学习它的优点以便够做出更好的工程决策。 开始 当 Go 程序启动时,它会为主机上标识的每个虚拟核心提供一个逻辑处理器(P)。如果处理器每个物理核心可以提供多个硬件线程(超线程),那么每个硬件线程都将作为虚拟核心呈现给 Go 程序。为了更好地理解这一点,下面实验都基于如下配置的 MacBook Pro 的系统。 可以看到它是一个 4 核 8 线程的处理器。这将告诉 Go 程序有 8 个虚拟核心可用于并...阅读全文

博文 2018-10-08 17:34:49 sxssxs

golang实现权重轮询调度算法

package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface{}{ 0: {"connectstring": "root@tcp(172.16.0.164:3306)/shiqu_tools?charset=utf8", "weight": 2}, 1: {"connectstring": "root@tcp(172.16.0.165:3306)/shiqu_tools?charset=utf8", "weight": 4}, 2: {"connectstring": "root@tcp(172.16.0.166:3306)/shiqu_tools?charset=utf8", "weight...阅读全文

博文 2017-09-04 16:00:03 zhangboyu

平滑的基于权重的轮询算法

轮询算法是非常常用的一种调度/负载均衡的算法。依照百度百科上的解释: Round-Robin,轮询调度,通信中信道调度的一种策略,该调度策略使用户轮流使用共享资源,不会考虑瞬时信道条件。从相同数量无线资源(相同调度时间段)被分配给每条通信链路的角度讲,轮询调度可以被视为公平调度。然而,从提供相同服务质量给所有通信链路的角度而言,轮询调度是不公平的,此时,必须为带有较差信道条件的通信链路分配更多无线资源(更多时间)。此外,由于轮询调度在调度过程中不考虑瞬时信道条件,因此它将导致较低的整体系统性能,但与最大载干比调度相比,在各通信链路间具有更为均衡的服务质量。 更广泛的轮询调度应用在广度的服务调度上面,尤其在面向服务或者是面向微服务的架构中,比可以在很多知名的软件中看到它的身影,比如LVS、Ng...阅读全文

博文 2017-02-08 12:53:44 smallnest

golang grpc 负载均衡

微服务架构里面,每个服务都会有很多节点,如果流量分配不均匀,会造成资源的浪费,甚至将一些机器压垮,这个时候就需要负载均衡,最简单的一种策略就是轮询,顺序依次选择不同的节点访问。 grpc 在客户端提供了负载均衡的实现,并提供了服务地址解析和更新的接口(默认提供了 DNS 域名解析的支持),方便不同服务的集成 使用示例 conn, err := grpc.Dial( "", grpc.WithInsecure(), // 负载均衡,使用 consul 作服务发现 grpc.WithBalancer(grpc.RoundRobin(grpclb.NewConsulResolver( "127.0.0.1:8500", "grpc.health.v1.add", ))), ) 创建连接的时候可以使...阅读全文

博文 2018-07-11 03:35:42 xjtuhit

Golang之实现一个负载均衡算法(随机,轮询)

代码记录 程序结构目录 --------程序包 package balance type Balancer interface { DoBalance([]*Instance, ...string) (*Instance, error) } balance.go package balance import ( "strconv" ) type Instance struct { host string port int } func NewInstance(host string, port int) *Instance { return &Instance{ host: host, port: port, } } //定义Instance结构体的方法GetHost() func (p *...阅读全文

golang grpc 负载均衡

微服务架构里面,每个服务都会有很多节点,如果流量分配不均匀,会造成资源的浪费,甚至将一些机器压垮,这个时候就需要负载均衡,最简单的一种策略就是轮询,顺序依次选择不同的节点访问 grpc 在客户端提供了负载均衡的实现,并提供了服务地址解析和更新的接口(默认提供了 DNS 域名解析的支持),方便不同服务的集成 使用示例 conn, err := grpc.Dial( "", grpc.WithInsecure(), // 负载均衡,使用 consul 作服务发现 grpc.WithBalancer(grpc.RoundRobin(grpclb.NewConsulResolver( "127.0.0.1:8500", "grpc.health.v1.add", ))), ) 创建连接的时候可以使用...阅读全文

博文 2018-06-24 05:34:43 hatlonely

Go调用SDL2的C语言动态库

# Go调用SDL2的C语言动态库 在网上找到go的GUI项目基本都需要安装额外软件库,尝试了一下使用go调用dll库的,有所收获,抛砖引玉,留个记录怕以后忘了。 ## 1.目录结构 ``` └─libtest │ main.go │ sdl.go └─ lib SDL2.dll ``` ## 2. 库函数封装(sdl.go) ``` package main import ( "syscall" "unsafe" ) //SDL_INIT_Flag 初始化标志 const ( SDL_INIT_TIMER = 0x00000001 SDL_INIT_AUDIO = 0x00000010 SDL_INIT_VIDEO = 0x00000020 /**< SDL_INIT_VIDEO impl...阅读全文

博文 2019-06-01 17:31:33 weiwg521

go-channel-goroutine实践2

需求:获取数组数据,对数据的原始数据逐个进行处理,后返回处理完的数据 目标:对列表数据进行逐个goroutine并发处理,再用select整合,返回数据 type money_per struct{ id int name string money float64 } type MoneyHandler interface { BatchDeal(m money_per) } type MoneyHandlerImpl struct { } func getMoneyHandler() MoneyHandler { return &MoneyHandlerImpl{} } var moneyPers = make([]money_per, 10) var mchan = make(chan ...阅读全文

博文 2016-10-17 03:00:03 niyuelin1990

网投现场火爆靠谱

相信大家都想找个正规的实体平台吧!找我你就选对了,我们的公司平台就在云南边界,说到云南大家应该不陌生吧!公司详细地址: 第一、云南省 第二、临沧市 第三、镇康县 第四、南伞镇 第五、就可以到达缅甸果敢老街腾龙集团,便是正规实体菠菜娱乐公司了!还有什么不懂的吗?尽管点击加卫咨—130 9439 1097—询即可! 第六、正规实体平台在线:WWW.tL8819.com 第七、公平.公正.公开 第八、合法菠菜.正规菠菜.诚信为本.信誉第一...阅读全文

beego的orm_,All() 竟然有限制 limit

生成sql查询竟然有限制 : LIMIT 1000 orm代码: ```go _, err := o.QueryTable(table).Filter("role_id", 0).All(&workers) ``` 对应 sql 查询记录: ``` [ORM]2019/08/24 15:15:59 -[Queries/default] - [ OK / db.Query / 9.5ms] - [SELECT T0.`id`, T0.`user_name`, T0.`real_name`, T0.`user_id`, T0.`phone`, T0.`number`, T0.`bank_num`, T0.`password`, T0.`salt`, T0.`sex`, T0.`role_id`,...阅读全文

博文 2019-08-24 16:23:35 stayfoo

tidb高并发查询与修改造成锁冲突

一、背景 1、现有的业务使用的是mongo,数据量达到将近2亿条数据,高并发查询与修改达到三分之一,一主两从的mongo架构,读写分离 2、现有二、问题在业务高峰期内mongo已经撑不住了,经常造成查询与修改达到几百ms,甚至有连接数用尽的情况, 未完。。...阅读全文

博文 2019-08-30 14:33:03 过几年qxx

Channels in Go range and select

这是Channels in go的第二篇,这篇主要讲range and select ,第一篇可以打开这个链接https://xiequan.info/channels-in-go/。 接收Channle的数据的时候我们会遇到,什么时候需要停止等待数据。有更多数据,还是已经全部完成?我们是继续等待还是继续?一种方法就是不断的轮询和检查通道是否已经关闭,但是这种方法并不是特别有效。 Channels and range Go提供了range关键词,当它与Channel 一起使用的时候他会等待channel的关闭。 package main import ( "fmt" "time" "strconv" ) func makeCakeAndSend(cs chan string, count i...阅读全文

博文 2017-02-10 12:27:16 谢权

golang使用Nsq

为什么要使用Nsq最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯。一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golang原汁原味的东西,功能齐全,关键是性能还不错。其中支持动态拓展,消除单点故障等特性, 都可以很好的满足我的需求下面上一张Nsq与其他mq的对比图,看上去的确强大。下面简单记录一下Nsq的使用方法图片来自golang2017开发者大会Nsq服务端Nsq服务端简介在使用Nsq服务之前,还是有必要了解一下Nsq的几个核心组件整个Nsq服务包含三个主要部分nsqlookupd先看看官方的原话是怎么说:nsqlookupd是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(to...阅读全文

博文 2017-09-02 07:30:08 zhangboyu

Go之一步步学习RabbitMQ(一)

本文来自公众号“灰子学技术”,原文链接:https://mp.weixin.qq.com/s/YDtJzDYn7EMeoupRFwrulg写在前面的话:最近笔者在学习RabbitMQ,便尝试着通过下面的学习过程,来尽量还原RabbitMQ为什么如此设计,以及它是如何解决这些问题的。当中如有不对或者理解偏差的地方,还请大家不吝赐教,多多留言。如果你觉得这篇文章真的帮到了你,还请你顺手转发下。背景知识:在学习RabbitMQ之前,我们需要对下面的知识有些概念,生产者(producer):产生并发送消息的程序。队列(queue):存在RabbitMQ中的邮筒,虽然消息是在应用程序和RabbitMQ中进行传递,但队列才是唯一能够存储消息的地方。队列的大小取决于宿主机器的内存和磁盘容量,它本质上是一个...阅读全文

博文 2019-11-04 08:47:02 ZhDavis

LVS负载均衡(LVS简介、三种工作模式、十种调度算法)

LVS负载均衡(LVS简介、三种工作模式、十种调度算法 一、LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都...阅读全文

博文 2019-01-09 22:34:42 Golang语言社区

golang grpc 负载均衡

微服务架构里面,每个服务都会有很多节点,如果流量分配不均匀,会造成资源的浪费,甚至将一些机器压垮,这个时候就需要负载均衡,最简单的一种策略就是轮询,顺序依次选择不同的节点访问 grpc 在客户端提供了负载均衡的实现,并提供了服务地址解析和更新的接口(默认提供了 DNS 域名解析的支持),方便不同服务的集成 使用示例 conn, err := grpc.Dial( "", grpc.WithInsecure(), // 负载均衡,使用 consul 作服务发现 grpc.WithBalancer(grpc.RoundRobin(grpclb.NewConsulResolver( "127.0.0.1:8500", "grpc.health.v1.add", ))), ) 创建连接的时候可以使用...阅读全文

博文 2018-06-24 03:34:45 hatlonely

深入浅出Rust Future Part-3

译自Rust futures: an uneducated, short and hopefully not boring tutorial - Part 3 - The reactor本文时间:2018-12-03,译者:motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址 ,好文将在以下地方直接展示 Rust中文社区首页 Rust中文社区Rust文章栏目 知乎专栏Rust语言 sf.gg专栏Rust语言 微博Rustlang-cn Intro 在这篇文章中我们将会讨论和阐释Reactor是如何工作的.在上篇文章中我们,我们频繁的使用Reactor来执行我们的Future,但是并没有阐述它是如何工作的。现在是时候阐明它了。 Reactor? Loop? ...阅读全文

博文 2018-12-05 08:34:47 krircc

长连接、短连接、长轮询、短轮询、WebSocket释疑

看到一篇不错的文章,特意转载过来,原文地址:长连接、短连接、长轮询、短轮询、WebSocket 一、短连接和长连接 短连接:每次Http请求都会建立Tcp连接,管理容易 长连接:只需要建立一次Tcp连接,以后Http请求重复使用同一个Tcp连接,管理难 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次挥手),等待在同域名下继续用这个通道传输数据;相反的就是短连接如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次挥手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。 在长连接的应用场景下,...阅读全文

博文 2019-09-19 10:02:49 Corwien

使用 Go 添加 Nginx 代理

简介 反向代理 负载均衡 轮询 加权轮询 最少连接 iphash 通用 hash 总结 当前部分的代码 简介 Nginx 是一个高性能的 HTTP 服务器和反向代理服务器. 最常用的两个功能是反向代理和负载均衡. 反向代理 反向代理是正向代理的反面. 普通的代理服务器是需要用户主动去设置的, 用户在自己的电脑上设置并连接代理服务器,从而可以隐藏自己的 IP, 使得应用服务器不知道客户端的 IP 地址. 而反向代理是作为应用服务器的代理, 安装在服务器上. 客户端实际上访问的反向代理服务器,反向代理服务器再去访问实际的应用服务器, 然后将获取到的响应传送给客户端. 使用 Nginx 配置反向代理非常简单, 基础配置如下: upstream web { server 127.0.0.1:8081...阅读全文

博文 2019-11-05 09:02:39 帅气猫咪

关于sqlx的问题

刚接触go,使用sqlx来开发,遇到以下问题 查询和新增的时候,需要使用不同的结构体传参,新增的时候需要用到上面的"UserForInser",而查询的时候因为需要判空,又需要用到"UserForQuery" 请问大家日常开发是怎么处理这种情况的 ``` type UserForInsert struct { Id string `db:"id"` OpenId string `db:"open_id"` Nickname string `db:"nickname"` Icon string `db:"icon"` Phone string `...阅读全文

GoLang使用Mysql

1、安装mysql开源库 go get github.com/go-sql-driver/mysql 2、go实现mysql的查询、插入、更新、删除 package main import ( "database/sql" "fmt" "time" _ "github.com/go-sql-driver/mysql" ) type User struct { id int64 `db:"id"` groupname sql.NullString `db:"groupname"` groupfatherid int `db:"groupfatherid"` remark sql.NullString `db:"remark"` } const ( USERNAME = "root" PASSW...阅读全文

博文 2019-11-22 12:32:49

兄弟连区块链培训分享Go语言-写并发注意事项

“区块链是一门集合密码学、共识算法、智能合约、超级账本等多门技术的复杂性综合学科。”尹正表示,区块链培训机构的师资质量及其对区块链行业的认知水平参差不齐,普通消费者也无从考究。 Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。写go语言并发需要注意的几点:1. golang 1.2版本 goroutine的runtime.GOMAXPROCS 如果没有被定义,默认是1,从1.5之后改为默认是runtime.CpuNum(),go底层其实是并发GOMAXP...阅读全文

博文 2018-08-21 15:35:16 兄弟连区块链培训

Golang的反射reflect深入理解和示例

本人认为讲解的最好的文章,在此做个备案。方便以后查询。 微信链接地址: https://mp.weixin.qq.com/s?__biz=MzI2NzE3NzMzNQ==&mid=2650555706&idx=1&sn=c5383ac15c0038fdf2ff29152ee419b5&chksm=f28a3922c5fdb034831e93fd82d760111fd07dc1b0ee6748f55fa0be6f569d46875b6631b097&mpshare=1&scene=1&srcid=&sharer_sharetime=1576809179753&sharer_shareid=9a8fb33c226ef040ec830cafc7905e51&key=e149ed35f0e9d79c...阅读全文

博文 2019-12-21 06:32:44 caoxinyiyi

NSQ学习:流控的实现

消息中间件的pull与push 消息中间件的实现无非两种套路,一种让客户端pull,典型的比如kafka便是如此,而另一种则是push,也就是让客户端不需要做任何操作,只需要做好conn便可以源源不断收到服务端的推送,典型的代表就是我们今天介绍的nsq。 pull的优势在于客户端可以自己做流控,比如客户端想什么时候pull就什么时候pull,不会因为服务端的强迫而接受,但劣势也很明显,如果服务端的生产速度很慢,客户端需要不断的轮询会让cpu处于繁忙且无用的状态。 push的优势则在于能够不受限于客户端的速度,可以让服务端更快的、批量的把数据push给客户端,因此大部分push实现的消息中间件都是属于内存型,而nsq比较特殊,它实际上是内存+磁盘的一个消息中间件。 push流的nsq如何做流控...阅读全文

博文 2019-06-11 01:02:39 imxyb

golang实现对docker容器心跳监控

自己写的go程序放到线上本来编译成二进制扔上去就行啦,但是怀着一颗docker的心,最终还是将它放到docker容器中运行起来了,运行起来也ok,一个最小容器64M,统一管理起来也方便,但是毕竟是个线上长驻内存的服务程序,万一跑挂了怎么办,如何才能监控它,直接上go代码,网上代码,略微做了下注释,但实测过,真实有效: package main import ( "encoding/json" "errors" "flag" "fmt" "io/ioutil" "log" "net" "os" "strings" "time" ) // 镜像结构 type Image struct { Created uint64 Id string ParentId string RepoTags []st...阅读全文

博文 2019-09-24 22:33:00 aside section ._1OhGeD

一种基于AliOS Things的uData感知设备软件框架

摘要:   uData框架设计之初的思想是基于传统sensorhub概念基础之上的,结合IoT的业务场景和AliOS Things物联网操作系统的特点设计而成的一个面对IoT的感知设备处理框架。 **点此查看原文**:http://click.aliyun.com/m/40592/ **uData诞生背景**   uData框架设计之初的思想是基于传统sensorhub概念基础之上的,结合IoT的业务场景和AliOS Things物联网操作系统的特点设计而成的一个面对IoT的感知设备处理框架。uData的主要目的是为了解决IoT端侧设备传感器开发的周期长、应用算法缺少和无云端数据一体化等痛点问题。 **uData概要介绍**   uData设计之初是遵循分层解耦...阅读全文

探讨tcp服务端代码热更新的问题[上]

前言: 对于代码的热更新我想大家都感兴趣,这也确实显得更加的高大上。 那么问题来了,你真的需求代码热更新么? 真的有必要设计这么复杂么? 强制更新代码会扣你工资? more ? 我想大家心里都有自己的答案。 作为一个技术及其时尚的coder,是有追求的,如果的kpi和激情的保证下,可以全力开火去实现热更新,如果你们不仅缺人又缺工时,那还b不如省点功夫不做代码级别的热更新,直接在架构上做AB灰度来更新服务代码。 该文章后续仍在不断更新中, 请移步到原文地址 http://xiaorui.cc/?p=4979 那么,听到这里估计你应该听出来热更新有两种方法了,一种是代码级别的,另一种是架构级别的。 代码级别热更新 在Python里面,我们可以在运行后动态的加载库,像这类动态语言基本都支持这类延迟...阅读全文

博文 2019-06-03 19:58:54 rfyiamcool

阿里云ECS开放批量创建实例接口,实现弹性资源的创建

摘要: 为了更方便的实现弹性的资源创建,方便用户一次运行多台ECS按量实例来完成应用的开发和部署,阿里云开放了ECS的批量创建实例接口RunInstances,可以单次最多创建100台实例,避免重复调用和创建。 **点此查看原文:http://click.aliyun.com/m/43195/** 为了更方便的实现弹性的资源创建,方便用户一次运行多台ECS按量实例来完成应用的开发和部署,阿里云开放了ECS的批量创建实例接口RunInstances,可以单次最多创建100台实例,避免重复调用和创建。创建成功后可以自动启动、提供公网访问能力、自动分配公网带宽以及可以预约自动释放。 **功能特性** RunInstances 批量创建实例接口可以帮助用户一次创建多台 E...阅读全文

马蜂窝 IM 系统架构的演化和升级

今天,越来越多的用户被马蜂窝持续积累的笔记、攻略、嗡嗡等优质的分享内容所吸引,在这里激发了去旅行的热情,同时也拉动了马蜂窝交易的增长。在帮助用户做出旅行决策、完成交易的过程中,IM 系统起到了重要的作用。 IM 系统为用户与商家建立了直接沟通的渠道,帮助用户解答购买旅行产品中的问题,既促成了订单交易,也帮用户打消了疑虑,促成用户旅行愿望的实现。伴随着业务的快速发展,几年间,马蜂窝 IM 系统也经历了几次比较重要的架构演化和转型。 IM 1.0 —— 初期阶段 初期为了支持业务快速上线,且当时版本流量较低,对并发要求不高,IM 系统的技术架构主要以简单和可用为目的,实现的功能也很基础。 IM 1.0 使用 PHP 开发,实现了 IM 基本的用户/客服接入、消息收发、咨询列表管理功能。用户咨询时...阅读全文

博文 2019-07-22 11:32:46 马蜂窝技术

分布式负载均衡算法之亲和性轮询原理

无论是在早期的负载均衡器中,还是当前微服务基于客户端的负载均衡中,都有一个最基础的轮询算法,即将请求平均分布给多台机器,今天聊聊在此基础上, kube proxy是如何实现亲和性轮询的核心数据结构. 了解亲和性策略实现,失败重试等机制 1. 基础筑基 1.1 Service与Endpoints Service和Endpoint是kubernetes中的概念,其中Service代表一个服务,后面通常会对应一堆pod,因为pod的ip并不是固定的,用Servicel来提供后端一组pod的统一访问入口, 而Endpoints则是一组后端提供相同服务的IP和端口集合在这节内容中大家知道这些就可以来, 1.2 轮询算法 轮询算法可能是最简单的算法了,在go里面大多数实现都是通过一个slice存储当前可...阅读全文

博文 2020-02-07 11:34:17 8小时_2020

快速对接payjs的个人支付接口(收银台模式)

近期在了解个人支付接口,希望能解决我在微信上支付的问题。找了很多平台对比再三,感觉payjs比较专业,其它多是模仿payjs的东西。同时支持支付宝和微信,由于本人支付宝还没开通(需要有一定流量才给开通),本文重点讲一下微信收银台模式的对接。记录一下。 收银台模式对接其实非常简单,官方有开发包可以直接使用,或者自己开发也比较简单。 ##### 一、个人通过代码实现的办法 - 配置商户号和通信密钥 ``` $mchid = '**************'; // PAYJS 商户号 $key = '**************'; // 通信密钥 ``` - 构造订单 ``` // 构造订单参数 $data = [ 'mchid' => $mchid, 'body' => '我是一个测试订单标...阅读全文

博文 2019-06-26 13:03:20 zilin9980

如何用 Redigo 访问 Codis

开篇依然是那三个问题: redigo 是否能够用于 codis ? 如果不经过任何加工, 直接用 redigo 去访问 codis, 会出现什么样的问题 ? codis 的 golang 客户端如何实现 ? 先贴出来, 我之前直接用 Redigo 接入 codis 的代码 // Redis global redis connection pool var Redis *redis.Pool var RedisInitErr = errors.New("init redis error") Redis = &redis.Pool{ MaxIdle: 10, Dial: func() (conn redis.Conn, e error) { addrs, err := getHosts() if...阅读全文

博文 2020-01-11 06:32:50 HHF技术博客