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

go使用token实现简单的权限管理

这里采用的是在header里设置token进行鉴权,cookie也类似:基本思路为前端在header里设置token,后端采用redis等进行存储,使用中间件进行鉴权,登录时设置token。以下是登录生成token:设置if err:=tools.NewAccountSsdbCache(info.Id,token);err!=nil { c.JSON(403,gin.H{ "status":403, "msg":to.String(err), }) return }方法func NewAccountSsdbCache(userid int64,val string)(err error){ ssdb,err:=common.NewSsdbClient() if err!=nil { retu...阅读全文

博文 2018-04-17 19:40:42 misasky

分布式事务一致性方案

http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例。传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库。我们通常只需借助开发平台中特有数据访问技术和框架(例如Spring、JDBC、ADO.NET),结合关系型数据库自带的事务管理机制来实现事务性的需求。关系型数据库通常具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。而大型互联网平台往往是由一系列分...阅读全文

博文 2017-03-09 05:02:33 jey恒

PostgreSQL与MongoDB竞争激烈 为事务我也选择了Postgre

欢迎大家一起讨论: MongoDB 不支持事务 也许需不需要数据库事务成了是否选择 MongoDB 的决定性因素,MongoDB 不支持数据库事务。 有很多应用对数据一致性其实要求不高,例如很多社交应用,大多数应用逻辑只是简单存取(发一段文字,上传一张照片),极少的不一致是不影响应用的。 而一些严肃应用,例如交易系统,就很需要数据库事务的支持了,否则就需要在应用层自己实现一个粗糙的、充满 Bug 的事务支持。如果有兴趣自己实现事务操作,可以看 MongoDB 的文章 Perform Two Phase Commits。 如果有跨系统的事务操作,就不能完全依赖数据库事务,还要有应用层的重试或回滚操作(例如远程调用支付接口)。数据库层面支持事务的话,起码...阅读全文

使用go作为RabbitMQ消费者的正确姿势

写在前面 在我们的生产环境中搭了两台rabbitmq, 前面架设了一台HAProxy做负载均衡,当我们的客户端连接到HAProxy,然后由HAProxy负责将链接分配给其中一台rabbitmq,客户端需要需要负责断线重连,需要将获取的数据,分配消息给相应的处理方法,然后还需要回复给rabbitmq ACK,这其中客户端需要负责断线重连的逻辑是很重要的,因为有可能客户端和HAProxy的连接是正常的,但是HAProxy和rabbitmq的链接因为网络波动断开了,那么这个时候客户端其实是没有工作的,并且会在rabbitmq中不断积累消息。 下面的内容给出了一个比较完善的处理逻辑,以供参考。 实战 定义接口 从之前的说明来看,这是一个典型的观察者模式,由RabbitMQ对象负责维护连接,获取消息,...阅读全文

博文 2017-08-13 05:34:53 这里好像没有人

最佳日志实践(v2.0)

----- 0. 缘起 ----- 大约在三年前,我曾经写过一篇 最佳日志实践 ( http://link.zhihu.com/?target=http%3A//blog.jobbole.com/56574/ ) ,还被码农周刊选为那年的 最受欢迎技术干货 ( http://link.zhihu.com/?target=http%3A//oiolong.github.io/linux/2015/01/04/manong-2014-collection.html ) 之一。当时我任职于网易杭州研究院的存储平台组,主要做网易对象存储(NOS)的开发和部分运维工作。由于网易云音乐,易信等几个重要产品陆续上线,业务压力剧增,我们的系统在前前后后大约半年的时间里,出现了大大小小各种事故。通过不断总结事...阅读全文

博文 2017-07-11 02:07:36 王健

kingtask:一个由Go开发的轻量级异步定时任务系统

# 1. kingtask简介 kingtask(https://github.com/flike/kingtask )是一个由Go开发的异步任务系统。主要特性包含以下几个部分: 1. 支持定时的异步任务。 2. 支持失败重试机制,重试时刻和次数可自定义。 3. 任务执行结果可查询。 4. 一个异步任务由一个可执行文件组成,开发语言不限。 5. 任务是无状态的,执行异步任务之前,不需要向kingtask注册任务。 6. broker和worker通过redis解耦。 7. 通过配置redis为master-slave架构,可实现kingtask的高可用,因为worker是无状态的,redis的master宕机后,可以修改worker配置将其连接到slave上。 # ...阅读全文

基于 Go 的推送通知服务器Gorush

Go(Golang)编写的推送通知服务器。 支持使用 Android 的 [go-gcm](https://github.com/google/go-gcm) 库的 [Google Cloud Message](https://developers.google.com/cloud-messaging/)(现为 [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/)) 支持使用  [apns2](https://github.com/sideshow/apns2) 库的苹果推送通知服务 支持 [YAML](https://github.com/go-yaml/yaml) 配置 支持使用...阅读全文

开源项目 2017-02-07 04:00:07 appleboy

Nsq从入门到实践

当nsq跑起来之后, 我们可能会遇到以下问题 分布式部署 处理错误(何时requeue) 如何使用golang lib 抱着不应该只停留在入门的态度, 笔者粗浅的研究了一下这几个问题, 希望也对有同样疑问的人有帮助. 部署 由于NSQ的分布式网络结构, NSQD必须广播(到lookup)自己的地址并让消费者连接, 那么多个NSQD无法做透明负载均衡. 就必须为每一个NSQD分配单独的IP(或host)以保证消费者(在lookup找到NSQ节点)能够正确的连接. 这样部署起来可能会麻烦一些 但问题不大, 注意一下就好. ps: 如果有更好的方法请告诉我, 小弟感激不尽. NSQ Requeue And Backoff 建议结合官方文档来看 requeue(重试) 用于当错误发生, 需要重试时....阅读全文

GRPC状态码

使用grpc的时候,线上php客户端调用go服务端,出现2/5/14等状态码,没有做日志输出,导致问题查了很长时间,最终问题是因为连接没有close掉,连接数不够了。 grpc的状态码在google.golang.org/grpc/codes:codes中,整理下状态码的翻译: 0:Ok:返回成功 1:Canceled:操作已取消 2:Unknown:未知错误。如果从另一个地址空间接收到的状态值属 于在该地址空间中未知的错误空间,则可以返回此错误的示例。 没有返回足够的错误信息的API引发的错误也可能会转换为此错误 3:InvalidArgument:表示客户端指定了无效的参数。 请注意,这与FailedPrecondition不同。 它表示无论系统状态如何(例如格式错误的文件名)都有问题的...阅读全文

博文 2018-11-16 19:34:47 王先森QAQ

golang实现热加载配置

今天继续优化了bigpipe项目,核心目标就是解决重启程序损失流量的问题。 背景 bigpipe作为一个消息中间件,其出现是为了给php程序提供方便的异步Http调用功能。然而php语言并不是常驻进程模型,当它请求bigpipe失败后,顶多重试几次,就必须尽快的向用户返回应答。因此,bigpipe服务的可用性是非常重要的。 bigpipe使用golang编写,采用channel逐层缓冲流量和数据,采用协程并发处理数据。因为bigpipe承接了若干业务,经常会对配置文件做一些修改,那么就必须重启bigpipe。 思考 在最初的版本中,bigpipe提供了优雅退出功能,也就是在退出前首先停止对外的Http服务,然后将进程内剩余的数据处理干净,最后再退出,这样不至于损失已经接受到的数据请求。 优雅...阅读全文

博文 2017-09-30 09:12:13 鱼儿的博客

作业调度服务器 Workq

Workq 是一个用 Go 开发的作业调度服务器。主要特性: * 异步和同步的作业处理 * 提交作业,然后在作业完成后返回结果,最多等待 TTL * 提交作业并马上获得执行结果 在任意时间临时安排作业调度 使用数值表示作业优先级 可以制定每个作业的 [TTR](https://github.com/iamduo/workq#ttr---time-to-run) (time-to-run) - 限制最大执行时间 可以制定每个作业的 [TTL](https://github.com/iamduo/workq#ttl---time-to-live) 超时 - 限制作业最大存活时间 每个作业可单独设置重试策略,包括 [max-attempts](https:...阅读全文

grpc文档与grpc-go的实现-连接语义和API

> 查看原文:[blog.keyboardman.me](http://blog.keyboardman.me/2018/02/08/grpc-doc-with-grpc-connectivity-semantics-and-api/) > 文档地址:[gRPC Connectivity Semantics and API](https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md) > 译文:[gitbook](https://0x5010.gitbooks.io/grpc-doc-zh/content/connectivity-semantics-and-api.html) > 译者:[0...阅读全文

博文 2018-02-08 17:06:50 0x5010

优雅实现延时任务之Redis篇

什么是延时任务延时任务,顾名思义,就是延迟一段时间后才执行的任务。举个例子,假设我们有个发布资讯的功能,运营需要在每天早上7点准时发布资讯,但是早上7点大家都还没上班,这个时候就可以使用延时任务来实现资讯的延时发布了。只要在前一天下班前指定第二天要发送资讯的时间,到了第二天指定的时间点资讯就能准时发出去了。如果大家有运营过公众号,就会知道公众号后台也有文章定时发送的功能。总而言之,延时任务的使用还是很广泛的。关于延时任务的实现方式,我知道的就不下于3种,后面会逐一介绍,今天就讲下如何用redis实现延时任务。延时任务的特点在介绍具体方案之前,我们不妨先想一下要实现一个延时系统,有哪些内容是必须存储下来的(这里的存储不一定是指持久化,也可以是放在内存中,取决于延时任务的重要程度)。首先要存储的...阅读全文

博文 2018-09-20 16:35:05 Java1324

Golang三种方式实现超时退出

问题 前段时间发现线上有个服务接口,总是间歇性告警,有时候一天两三次,有时候一天都没有。 告警的逻辑是在一个接口中异步调用了另一个HTTP接口,这个HTTP接口调用出现超时。但是我去问了负责这个HTTP接口的同学,人家说他们的接口相应都是毫秒级别,还截图监控了,有图有真相,我还能说啥。 但是,超时是确实存在的,只是请求还可能没有到人家服务那边。 这种偶发性问题不好复现,偶尔来个告警也挺烦的,第一反应还是先解决问题,思路也简单,失败后重试。 解决方法 且不谈重试策略,先说说什么时候触发重试。 我们可以在接口请求出错抛出err的时候重试,但是这种不好控制,如果一个请求出去,十来秒都没有响应,则这个协程就要傻傻的等他报错才能重试,浪费生命啊~ 所以结合上面同学给出的毫秒级响应指标,可以设定一个超时...阅读全文

博文 2020-03-22 22:34:25 JackieZheng

[译] 设计一个容错的微服务架构

[译] 设计一个容错的微服务架构 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 原文地址 https://blog.risingstack.com/designing-microservices-architecture-for-failure/ 微服务架构使得可以通过明确定义的服务边界来隔离故障。但是像在每个分布式系统中一样,发生网络、硬件、应用级别的错误都是很常见的。由于服务依赖关系,任何组件可能暂时无法提供服务。为了尽量减少部分中断的影响,我们需要构建容错服务,来优雅地处理这些中断的响应结果。 本文介绍了基于RisingStack 的 Node.js 咨询和开发经验构建和操作高可用性微服务系统的最常见技术和架构模式...阅读全文

博文 2017-08-23 01:36:07 jasonGeng88

故障驱动的微服务架构设计

此文背景:之所以发布此文,是有一个直接的原因,就是我们之前在线上遇到了一个使用timeout来判断是否失败的案例,这是真实的,结果就是效果很不好。看了本文中介绍的各种技术和架构模式,让我忽然对之前的这个案例有了一个新的认识,就是“快速失败”不应该依赖于传统的比如timeout这种超时机制来进行,也许使用本文中介绍到的技术(比如:Circuit Breakers)要更加地可靠和受控。目录微服务架构的风险优雅的服务降级变更管理健康检查和负载平衡自愈(Self-healing)故障转移缓存(Failover Caching)重试逻辑(Retry Logic)速率限制器和负载开关(Rate Limiters and Load Shedders)快速失败(Fail Fast and Independe...阅读全文

博文 2017-08-27 18:07:23 贺卓凡译Péter著

Go 微服务中的熔断器和重试

今天我们来讨论微服务架构中的自我恢复能力。通常情况下,服务间会通过同步或异步的方式进行通信。我们假定把一个庞大的系统分解成一个个的小块能将各个服务解耦。管理服务内部的通信可能有点困难了。你可能听说过这两个著名的概念:熔断和重试。 ## 熔断器 ![01](https://raw.githubusercontent.com/gctt-images2/blob/master/circuit-breaker-and-retry/01.png) 想象一个简单的场景:用户发出的请求访问服务 A 随后访问另一个服务 B。我们可以称 B 是 A 的依赖服务或下游服务。到服务 B 的请求在到达各个实例前会先通过负载均衡器。 后端服务发生系统错误的原因有很多,例如慢查询、network blip 和内存争用。...阅读全文

博文 2019-12-11 16:35:30 lxbwolf

关于在 Go 代码中使用退避方法,啰嗦几句(Yak Shaving With Backoff Libraries in Go)

我相信你有过调用 API 接口需要使用退避算法的时候。在 Go 语言现有技术中,有 [github.com/cenkalti/backoff](https://github.com/cenkalti/backoff),[github.com/jpillora/backoff](https://github.com/jpillora/backoff),和其它库可以使用。 我曾经使用过 [github.com/cenkalti/backoff](https://github.com/cenkalti/backoff),但是有一件让我感到困惑的事:它要求你为操作加上闭包,强制输入为 func() error 的形式。 举个例子,当你需要一个可以自动重试的函数(如下面的 myFunc 函数),返回 ...阅读全文

博文 2018-03-09 11:37:41 gogeof

轻量高性能的任务队列系统Fireworq

Fireworq 是一个轻量、高性能、语言无关的任务队列系统。具有以下特性: 可移植性:适用于任何能使用 HTTP 的语言 可靠性:构建于 RDBMS (MySQL) 之上,即使任务队列进程死亡,也不会将任务丢失 可用性:支持主/备份节点。一个节点成为主节点,其他节点成为备份节点。当主节点挂了之后,备份节点将自动激活 可伸缩性:它始终与每个队列的单个调度程序一起运行 灵活性:支持多队列、延迟任务、任务重试 可维护性:支持在 Web UI 上进行管理,还提供了适合监控的指...阅读全文

开源项目 2017-12-27 14:00:03 网友

golang grpc keepalive

最近遇到 grpc 客户端报错 rpc error: code = Unavailable desc = transport is closing,原因是连接长时间没有使用,被服务端断开,这种情况通过简单粗暴的重试策略可以解决,更加优雅的解决方案是增加保持连接策略 服务端 var kaep = keepalive.EnforcementPolicy{ MinTime: 5 * time.Second, // If a client pings more than once every 5 seconds, terminate the connection PermitWithoutStream: true, // Allow pings even when there are no acti...阅读全文

博文 2019-11-27 23:32:41

Golang三种方式实现超时退出

问题 前段时间发现线上有个服务接口,总是间歇性告警,有时候一天两三次,有时候一天都没有。 告警的逻辑是在一个接口中异步调用了另一个HTTP接口,这个HTTP接口调用出现超时。但是我去问了负责这个HTTP接口的同学,人家说他们的接口相应都是毫秒级别,还截图监控了,有图有真相,我还能说啥。 但是,超时是确实存在的,只是请求还可能没有到人家服务那边。 这种偶发性问题不好复现,偶尔来个告警也挺烦的,第一反应还是先解决问题,思路也简单,失败后重试。 解决方法 且不谈重试策略,先说说什么时候触发重试。 我们可以在接口请求出错抛出err的时候重试,但是这种不好控制,如果一个请求出去,十来秒都没有响应,则这个协程就要傻傻的等他报错才能重试,浪费生命啊~ 所以结合上面同学给出的毫秒级响应指标,可以设定一个超时...阅读全文

博文 2020-03-22 22:32:45 Jackie_Zheng

etcd API使用

## 连接客户端 访问etcd首先要创建client,它需要传入一个Config配置. `Endpoints`:etcd的多个节点服务地址。 `DialTimeout`:创建client的首次连接超时时间,这里传了5秒,如果5秒都没有连接成功就会返回err;一旦client创建成功,不用再关心后续底层连接的状态了,client内部会重连。 ``` cli,err := clientv3.New(clientv3.Config{ Endpoints:[]string{"localhost:2379"}, DialTimeout: 5 * time.Second, }) ``` 返回的 client,它的类型具体如下: ``` type Client struct { Cluster KV Le...阅读全文

博文 2019-11-06 14:42:02 bytemode

golang dns 查询超时故障定位

近来线上反向代理出现异常日志:lookup http:// xxx.xxx.com ( http://link.zhihu.com/?target=http%3A//xxx.xxx.com ) on 10.0.0.1:53: dial udp 10.0.0.1:53: i/o timeout,显然是dns查询超时导致。但问题是,golang中dial udp的操作只是单纯的创建epoll对象,并不存在真正的i/o操作,谈何超时一说? 既然如此,先尝试线下复现,再来定位。 *运行环境* * CentOS release 6.4 (Final) 虚机 * go version go1.7 linux/amd64 *模拟现场* 代码地址 ( http://link.zhihu.com/?targe...阅读全文

博文 2017-06-29 02:33:04 曹东

golang操作MySQL几个原则和示例

使用原则 库自带连接池,使用方不需自行实现。*sql.DB 线程安全,开箱即用,屏弊了底层创建连接的实现 Open 只是创建类,调用一次即可,使用前需要 Ping 确保连接正常。 一定要设置连接池的两个参数 MaxIdle, MaxOpen,否则在极端情况会把 DB 连接打满(未加索引,大事务阻塞)。可选 MaxLifetime,需咨询 DBA,一般 DB 默认8小时,无需设置,如果很短要视情况而定 事务会占用一个连接,尽可能减小事务耗时,打散大事务,否则会将 DB 连接数打满 prepare 会占用一个连接,每次使用完后,一定要 close ,否则同样会将连接数打满 DSN 需要指定时区和对时间字段的支持,否则会出现时间提前8小时的问题 Query, Prepare, Exec 无需业务层...阅读全文

博文 2017-02-10 06:32:37 董泽润

为什么我们要使用Go语言以及如何使用它的

本文选自:外刊IT评论网 我们SoundCloud是一个使用多种编程语言的公司,虽然我们的技术架构最外层一直使用的是Ruby on Rails,但是在后端,各种各样的编程语言都有涉及。在这里我想多讲一下为什么要使用和如何使用Go这样一种开源的、刚刚发布其1.0版本的编程语言的。 在我们的公司里,所有的技术人员都是全能选手,而不是专才,这是根植于公司基因文化里的特征。我们希望每个人都能对公司的基础架构中每一部分都至少有相当的了解。更进一步,我们鼓励技术人员在个开发团队间调换,甚至组成新的团队,使成员跟各团队的冲突和摩擦尽量减少。在这样一种代码共产共有的环境中,非常需要一种表达性强,效率高的语言来降低实施的困难,Go语言证明了它是一种非常适合的语言。 GoogleGolanguage 我们已经有...阅读全文

博文 2014-10-19 14:00:00 liuzif

阿里HBase的数据管道设施实践与演进

摘要:第九届中国数据库技术大会,阿里巴巴技术专家孟庆义对阿里HBase的数据管道设施实践与演进进行了讲解。主要从数据导入场景、 HBase Bulkload功能、HImporter系统、数据导出场景、HExporter系统这些部分进行了讲述。 直播视频请点击:http://click.aliyun.com/m/51037/ PPT下载请点击:http://click.aliyun.com/m/51038/ 精彩视频整理: 数据导入场景 生意参谋 生意参谋是一种为商家服务,帮助商家进行决策和运营的数据产品。如在淘宝或天猫上开一家店,生意参谋会提供店里每天进入的流量、转化率、客户的画像和同行业进行对比这些数据属于什么位置。商家可以根据流量分析、活动分析和行业分析去进行决策。可...阅读全文

微服务的断路器实现图解Golang通用版

断路器背景 微服务连锁故障场景 image 在分布式环境中,各个微服务相互调用,当某些情况下,比如后端中间件服务故障、第三方服务中断导致某个服务无限期不可用,短时间无法恢复,则可能会导致连锁故障,最终影响压垮整个业务集群 断路器与重试 断路器模式不同于重试模式,重试模式是使应用程序可以重试操作以期望它会成功,而断路器模式是防止应用程序执行一个可能失败的操作,减少执行可能失败操作的CPU、内存、线程等资源的浪费,从而保证服务的整体可用 断路器设计解析 基于代理模式的断路器 image 断路器相当于一个请求操作执行的代理,托管请求操作的执行 实现原理流程: 拦截服务执行的请求,通过当前状态决定是否直接返回,如果否则执行后续操作 尝试执行操作,并获取返回结果 根据返回结果和当前统计信息,决定当前断...阅读全文

博文 2019-05-15 07:34:48 布衣_4549

用go语言来做嵌入式-读写铁电存储器

# 用go语言来做嵌入式-读写铁电存储器 ## 存储器介绍 在嵌入式设备中使用的存储芯片一般多用的Flash芯片或者EEPROM芯片的,它们的擦写次数大概是10万-100万次,而且写入时间也是毫秒级别,再一些对关键参数存储要求较高的场景下,就需要使用铁电存储器了,铁电存储器的读写次数以亿级来算,而且写入时间可以达到纳秒级,存储非常可靠。 ## 项目背景 我最近在我们一款采集设备上应用到了一款FM24CL64的8KB的铁电存储器,该芯片是I2C接口的,该设备是基于mtk7688主芯片,linux内核的openwrt系统,应用程序采用go语言开发,研究了一下该芯片的手册后,基于linux的标准i2c接口,编写了go语言版本的铁电存储器读写代码,并成功应用到产品中。 ## 驱动和测试程序 ``` ...阅读全文

博文 2019-06-29 11:07:01 byteman

Golang 任务池

# Task Pool [GitHub地址](https://github.com/overtalk/task) Task Pool 是一个易于使用且高度可配置的 golang类库,专门用于任务的管理&执行,支持自定义次数的重发。 ## 功能特点 - 线程安全 - task pool 内所有的方法以及暴露的接口都是线程安全的 - 异步发送 - 调用 PushTask 方法后回立即返回,任务将会被传递到io线程中异步发送,不阻塞用户操作。 - 失败重试 - 用户可以通过设置初始化的参数来指定任务执行失败的次数,超过重试次数将被投递到失败队列。 - 优雅关闭 - 用户调用关闭方法进行关闭时,task pool 会将所有其缓存的数据进行发送,防止任务丢失。 - 结果可控 - 用户可以自己实现 Ta...阅读全文

博文 2020-02-21 16:07:59 qinhan_shu

golang中往channel写入数据的时候,能不能指定从头部写入还是从尾部写入?

RT,业务场景需要,从channel读出数据后,如果处理失败,需要把数据再丢入channel,再处理。但是因为数据有一定的顺序(不能把失败的数据写到channel的尾部),所以我再把失败的数据丢入channel准备重试的时候,需要丢到channel的头部,然后再读出来进行重...阅读全文

Service Mesh 了解吗?

Service Mesh 了解吗 简书 涤生。 转载请注明原创出处,谢谢! 如果读完觉得有收获的话,欢迎点赞加关注。 目录 背景 是什么 能做什么 如何实现 优势 问题 展望 1 背景 1.1 多语言 微服务理念是提倡不同业务使用最适合它的语言开发,现实情况也确实如此,尤其是AI的兴起,一般大型互联网公司存在 C/C++、Java、Golang、PHP、Python、NodeJs 等语言的项目,这就意味着每种语言都需要实现了相同功能服务框架。然而,服务框架的 SDK 通常实现都比较重,需要实现服务注册与发现、服务路由、负载均衡、服务鉴权、服务降级、服务限流、网络传输等功能,所以这块的成本不言而喻。 1.2 产品交付 在伴随着服务组件的功能升级,bug 修复过程中,业务系统需要升级依赖的服务组...阅读全文

博文 2018-08-11 22:35:04 涤生_YinQi

Golang 业务限流器

github地址 https://github.com/xiaowei520... package rate import ( "math/rand" "sync" "sync/atomic" "time" ) //使用cas 锁来实现、减少开销 //业务限流器 const ( Normal = iota AbNormal ) //标示, 可以是appId uid 唯一性的代表值 type Limit float64 type Limiter struct { limit Limit EventName string //cas done uint32 //时间 retryTime int //重试次数 retryLen int //最大缓冲时间 maxTime int64 //最小缓冲时间...阅读全文

博文 2019-09-27 16:02:53 xiaowei520

Go微服务容错与韧性(Service Resilience)

Service Resilience是指当服务的的运行环境出现了问题,例如网络故障或服务过载或某些微服务宕机的情况下,程序仍能够提供部分或大部分服务,这时我们就说服务的韧性很强。它是微服务中很重要的一部分内容,并被广泛讨论。它是衡量服务质量的一个重要指标。Service Resilience从内容上讲翻译成“容错”可能更接近, 但“容错”英文是“Fault Tolerance”,它的含义与“Service Resilience”是不同的。因此我觉得翻译成“服务韧性“比较合适。服务韧性在微服务体系中非常重要,它通过提高服务的韧性来弥补环境上的不足。 服务韧性通过下面几种技术来提升服务的可靠性: 服务超时 (Timeout) 服务重试 (Retry) 服务限流(Rate Limiting) 熔断...阅读全文

博文 2019-09-26 16:02:45 倚天码农

马蜂窝消息总线——面向业务的消息服务设计

引言马蜂窝消息总线于 2017 年 11 月份上线,截至目前,已经被电商、酒店、大交通、社区等多个技术团队投入到生产环境的使用中。近一年时间里,消息总线经历过几次比较重要的功能迭代,承担了 PHP 在线服务异步、削峰、解耦的大部分任务。这篇文章的目的主要是和大家交流下马蜂窝消息总线的设计原因、实现原理以及未来规划,希望能和有潜在需求的研发同学一起探讨。我们为什么需要消息总线?在消息总线上线前,马蜂窝大部分业务中的异步需求是通过 Redis 队列来实现。随着消息量增加,经常会出现消息积压、不同消息之间互相影响的问题。为解决这些问题,电商研发团队开始规划和设计消息总线。为什么会有消息总线,而不是让业务系统直接用 PHP 或者其他语言对接 RabbitMQ,Kafka 这样的消息系统?「消息总线和...阅读全文

博文 2019-02-22 16:34:48 马蜂窝技术

关于dubbo,这里有你不得不看的18个BAT面试题

![](https://upload-images.jianshu.io/upload_images/16533261-434fd1c2db44585b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## **dubbo是什么** dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含:集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平...阅读全文

博文 2019-04-25 16:54:48 Javaxiaoze

Go Channel 高级实践

本文主要讲实践,原理部分会一笔带过,关于 go 语言并发实现和内存模型后续会有文章。 channel 实现的源码不复杂,推荐阅读,https://github.com/golang/go/blob/master/src/runtime/chan.go channel 是干什么的 意义:channel 是用来通信的 实际上:(数据拷贝了一份,并通过 channel 传递,本质就是个队列) channel 应该用在什么地方 核心:需要通信的地方 例如以下场景: 通知广播 交换数据 显式同步 并发控制 ... 记住!channel 不是用来实现锁机制的,虽然有些地方可以用它来实现类似读写锁,保护临界区的功能,但不要这么用! channel 用例实现 超时控制 // 利用 time.After 实现...阅读全文

博文 2018-08-29 17:35:36 sxssxs

TCP SYN队列与Accept队列详解

李乐   尽信书,不如无书。   纸上得来终觉浅,绝知此事要躬行。   实验现象依赖于系统(如下)以及内核参数(附录);一切以实验结果为准。 cat /proc/version Linux version 3.10.0-693.el7.x86_64 引子   线上服务(Golang)调用内网API服务(经由内网网关/Nginx转发)时,偶尔会出现"connection reset by peer"报警;为此梳理TCP RST包可能产生的几种情况: 目的主机防火墙拦截; 向已关闭的socket发送数据; 全连接队列溢出; 向已经"消逝"的连接发送数据。   情况说明:Golang服务作为客户端,内网网关Nginx作为服务端,HTTP请求默认基于长连接(连接池)。   情况1非常容易理解;同机房...阅读全文

博文 2020-04-08 22:32:42 LNMPR源码研究

数据一致性(一)

MySQL的事务是数据一致性的典范,事务内的执行要么都成功,要么都失败。但业务系统涉及系统间的相互调用,涉及的数据库也不尽相同,所以实现数据一致性还是有挑战的。 首先了解强一致性和弱一致性。在微服务中,系统间通过HTTP的方式相互调用,很难实现数据的强一致。我们这里主要说弱一致性,也就是数据最终一致性。 数据一致性还有个重要的前提:支持幂等。也就是说,只要请求参数不变,那么无论重复请求多少次,结果都一样。在对接第三方支付时,这个词出现的频率还是老高的。 购买业务 蜗牛要在一家电商网站买电子书,整个购买流程和涉及的系统虚构如下图。过程涉及检查它是否已经买过,然后是生成订单号、支付、交付(实际上订单系统不包含支付功能,这里简化处理)。

交付涉及三个系统,在任...阅读全文

博文 2018-12-02 00:34:40 欧阳少辰

服务超时总结

介绍 超时 请求超时,客户端给服务端发送请求时超时,此时服务端没有收到客户端的请求; 服务端内部超时,服务端可能存在DB操作、IO操作、调用其他服务超时; 响应超时,服务端给客户端返回响应时超时,此时服务端已经处理了请求。 超时发生需要客户端和服务端如何处理呢? 客户端最常见方法: 重试(前提是服务端接口支持幂等),重试间隔梯度增大,重试次数阈值最大值 不重试直接去查询请求结果状态,根据结果确认是否请求成功,或者什么都不处理,直接认为失败不做进一步处理 具体接口场景具体对待 服务端: 服务端内部如果超时了,应该尽快给客户端返回,告诉客户端超时失败,这个主要是通过服务端内部超时控制来实现,例如:golang http.TimeoutHandler 幂等性 支持接口无限重试主要靠的就是幂等性,实...阅读全文

博文 2019-08-20 22:02:43 凯文不上班

系统编写练习:命令执行系统

需求: 编辑常用的命令,在某台机器上发送命令并执行。能够查看操作记录、执行状态。 系统: centos7 语言: golang、shell等 表 通用字段: id、created_at、modified_at、deleted_at 主机表(host) user(账号)、ip、passwd 操作表(operation) name、description、language(golang、shell)、input(输入字段名称及类型)、impl(实现接口、shell语句)【可能的扩展:多版本、安装、卸载、升级、回滚、重试】 操作记录表(operation_record) target(user:1234@ip)、operation_id、operation_name、params(参数)、resu...阅读全文

博文 2020-05-19 10:32:54 我就是小政政

使用Envoy 作Sidecar Proxy的微服务模式-2.超时和重试

本博客是深入研究Envoy Proxy和Istio.io 以及它如何实现更优雅的方式来连接和管理微服务系列文章的一部分。 这是接下来几个部分的想法(将在发布时更新链接): 断路器(第一部分) 重试/超时(第二部分) 分布式跟踪(第三部分) Prometheus的指标收集(第四部分) 服务发现(第五部分) 第一部分 - 使用envoy proxy 实现超时和重试 第一篇博文向您介绍了Envoy Proxy的断路功能实现。在第二部分中,我们将详细介绍如何启用其他弹性功能,如超时和重试。有意进行一些简单的演示,因此我可以单独说明模式和用法。请下载此演示的源代码并按照说明进行操作! 该演示由一个客户端和一个服务组成。客户端是一个Java http应用程序,模拟对“上游”服务进行http调用(注意,我...阅读全文

博文 2019-02-22 23:34:41 iyacontrol

【转】Go 用 500 行 Golang 代码实现高性能的消息回调中间件

文地址:https://ruby-china.org/topics/34240 本文描述了如何实现一个消息回调中间件,得益于 golang 管道和协程的编程思想,通过巧妙的设计,只需要约500行代码就可以实现高性能、优雅关闭、自动重连等特性,全部代码也已经开源在 github/fishtrip/watchman。 问题 随着业务复杂度的增加,服务拆分后服务数量不断增加,异步消息队列的引入是必不可少的。当服务较少的时候,比如业务早期,很多时候就是一个比较大的单体应用或者少量几个服务,消息队列(之后写做 MQ,Message Queue)的使用方法如下: 发送端,直接连接 MQ,根据业务需求发送消息; 消费端,通过一个后台进程,通过长连接连接至 MQ,然后实时消费消息,然后进行相应的处理; 相对...阅读全文

博文 2018-10-26 18:34:42 weylau

go中函数选项模式

作为golang开发人员,您将遇到的许多问题之一是尝试将函数的参数设置为可选。有时候使用默认设置,但有时候需要提供自定义设置。 在许多语言中,这很容易;在c系列语言中,您可以使用不同数量的参数提供相同函数的多个版本,在php这样的语言中,您可以为参数提供默认值,并在调用方法时忽略它们。但在golang您不能做到这两点。那么在go中该如何实现呢? 我们来看一个例子吧,假设我们有一个名为StuffClient的服务,它可以执行一些操作并具有两个配置选项(超时和重试): type StuffClient interface { DoStuff() error } type stuffClient struct { conn Connection timeout int retries int } ...阅读全文

博文 2019-06-04 20:33:09 wx5cf612fe3a728

CentOS7安装supervisor

supervisord 是Linux/Unix系统下的一个进程管理工具 一、安装sudo yum install supervisor二、设置开机sudo systemctl enable supervisord.service三、配置文件相关supervisord 的配置文件是 /etc/supervisord.conf 自定义配置文件目录是/etc/supervisord.d,该目录下文件以.ini为后缀四、supervisord 命令1、启动sudo systemctl start supervisord.service2、关闭sudo systemctl stop supervisord.service3、重启sudo systemctl restart supervisord.se...阅读全文

博文 2018-07-06 14:34:48 为技术疯狂

k8s使用Job执行任务失败了怎么办

Kubernetes 中使用 Job 和 CronJob 两个资源分别提供了一次性任务和定时任务的特性,这两种对象也使用控制器模型来实现资源的管理,我们在这篇文章来介绍Job执行如果失败了会怎么样呢? 修改job-fail.yaml,故意引入一个错误: Never 如果将 restartPolicy 设置为 Never 会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。 运行 Job 并查看状态,可以看到Never策略的job,pod失败后,重新创建: 直到重新创建7个(spec.backoffLimit默认为6,即重试6次,共7个pod)pod都失败后,认为失败,job的status里会更新为Failed 当前 Completion 的数量为 0 查看 Pod 的状态:...阅读全文

博文 2019-10-16 10:33:20 小碗汤

微服务的断路器实现图解Golang通用实现

断路器背景 微服务连锁故障场景 在分布式环境中,各个微服务相互调用,当某些情况下,比如后端中间件服务故障、第三方服务中断导致某个服务无限期不可用,短时间无法恢复,则可能会导致连锁故障,最终影响压垮整个业务集群 断路器与重试 断路器模式不同于重试模式,重试模式是使应用程序可以重试操作以期望它会成功,而断路器模式是防止应用程序执行一个可能失败的操作,减少执行可能失败操作的CPU、内存、线程等资源的浪费,从而保证服务的整体可用 断路器设计解析 基于代理模式的断路器 断路器相当于一个请求操作执行的代理,托管请求操作的执行 实现原理流程: 拦截服务执行的请求,通过当前状态决定是否直接返回,如果否则执行后续操作 尝试执行操作,并获取返回结果 根据返回结果和当前统计信息,决定当前断...阅读全文

博文 2019-05-15 14:36:12 qq5cd4cba85dd8a

golang 死锁

解决死锁,加goroutine or 重试 var wg sync.WaitGroup func main() { wg.Add(1) c := make(chan int) go readFromChannel(c, time.After(time.Duration(2)*time.Second)) time.Sleep(time.Duration(5) * time.Second) c <- 10 wg.Wait() } func readFromChannel(c chan int, ti <-chan time.Time) { select { case x := <-c: fmt.Println("Read", x) case <-ti: fmt.Println("TIMED OU...阅读全文

博文 2020-04-06 21:32:56 anthonydan

Go 每日一库之 watermill

简介 在上一篇文章Go 每日一库之 message-bus中,我们介绍了一款小巧、实现简单的异步通信库。作为学习,message-bus确实不错。但是在实际使用上,message-bus的功能就有点捉襟见肘了。例如,message-bus将消息发送到订阅者管道之后就不管了,这样如果订阅者处理压力较大,会在管道中堆积太多消息,一旦订阅者异常退出,这些消息将会全部丢失!另外,message-bus不负责保存消息,如果订阅者后启动,之前发布的消息,这个订阅者是无法收到的。这些问题,我们将要介绍的watermill都能解决! watermill是 Go 语言的一个异步消息解决方案,它支持消息重传、保存消息,后启动的订阅者也能收到前面发布的消息。watermill内置了多种订阅-发布实现,包括Kafk...阅读全文

博文 2020-03-01 17:35:52 darjun