Go并发编程之美-CAS操作摘要:一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类 。相比Java来说go提供了独特的基于通道的同步措施 。本节我们先来看看go中CAS操作 二、CAS操作 go中的Cas操作与java中类似,都是借用了CPU提供的原子性指令来实现 。
go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施 , 比如低级的同步措施有 锁、CAS、原子变量操作类 。相比Java来说go提供了独特的基于通道的同步措施 。本节我们先来看看go中CAS操作
go中的Cas操作与java中类似,都是借用了CPU提供的原子性指令来实现 。CAS操作修改共享变量时候不需要对共享变量加锁,而是通过类似乐观锁的方式进行检查,本质还是不断的占用CPU 资源换取加锁带来的开销(比如上下文切换开销) 。下面一个例子使用CAS来实现计数器
go中CAS操作具有原子性,在解决多线程操作共享变量安全上可以有效的减少使用锁所带来的开销,但是这是使用cpu资源做交换的 。
我简单列举了并发编程的大纲 , 需要详细的私信“555”~~
golang使用Nsq1. 介绍
最近在研究一些消息中间件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等 。NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件 。
官方和第三方还为NSQ开发go语言单点登录了众多客户端功能库,如官方提供的基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScript客户端nsqjs、异步C客户端libnsq、Java客户端nsq-java以及基于各种语言的众多第三方客户端功能库 。
1.1 Features
1). Distributed
NSQ提供了分布式的,去中心化,且没有单点故障的拓扑结构,稳定的消息传输发布保障,能够具有高容错和HA(高可用)特性 。
2). Scalable易于扩展
NSQ支持水平扩展,没有中心化的brokers 。内置的发现服务简化了在集群中增加节点 。同时支持pub-sub和load-balanced 的消息分发 。
3). Ops Friendly
NSQ非常容易配置和部署 , 生来就绑定了一个管理界面 。二进制包没有运行时依赖 。官方有Docker image 。
4.Integrated高度集成
官方的 Go 和 Python库都有提供 。而且为大多数语言提供了库 。
1.2 组件
1.3 拓扑结构
NSQ推荐通过go语言单点登录他们相应的nsqd实例使用协同定位发布者,这意味着即使面对网络分区,消息也会被保存在本地 , 直到它们被一个消费者读取 。更重要的是,发布者不必去发现其他的nsqd节点,他们总是可以向本地实例发布消息 。
NSQ
首先,一个发布者向它的本地nsqd发送消息,要做到这点,首先要先打开一个连接,然后发送一个包含topic和消息主体的发布命令,在这种情况下,go语言单点登录我们将消息发布到事件topic上以分散到我们不同的worker中 。
事件topic会复制这些消息并且在每一个连接topic的channel上进行排队,在我们的案例中,有三个channel,它们其中之一作为档案channel 。消费者会获取这些消息并且上传到S3 。
nsqd
每个channel的消息都会进行排队,直到一个worker把他们消费,如果此队列超出了内存限制,消息将会被写入到磁盘中 。Nsqd节点首先会向nsqlookup广播他们的位置信息,一旦它们注册成功,worker将会从nsqlookup服务器节点上发现所有包含事件topic的nsqd节点 。
nsqlookupd
2. Internals
2.1 消息传递担保
1)客户表示已经准备好接收消息
2)NSQ 发送一条消息,并暂时将数据存储在本地(在 re-queue 或 timeout)
推荐阅读
- gopro直播卖货,gopro直播平台
- 贵美商城首页html代码的简单介绍
- sap杨伯宁,杨伯江个人资料
- vb.net人脸定位 vb人脸识别
- 电视怎么通过u盘看电视的简单介绍
- 益智游戏荷塘,一款叫荷塘的智力游戏
- 快手怎么在网络直播赚钱,快手怎么直播赚钱???需要什么??
- java代码加密教程 java最简单的加密方式
- 如何设置word数字格式,怎么设置word中的数字格式