Go并发编程--sync包来实现环形缓冲队列
概述
环形缓冲区是另一个十分经典的生产者-消费者模型。其基本思想是:先开辟一块固定的内存作为保存元素(相同类型)的缓冲区,注意是一块固定的内存,开辟后大小就不能再修改了。也可以理解是一个数组。
当生产者往缓冲区中放入元素时,判断是否已经到了该队列的末尾,若到了末尾则应该,绕回到队列的首部放入元素,也就是第0个位置。
而消费者也是类似的操作(当取元素的位置到了队列最后一个,则绕回到第0个位置)...
如何用Go实现一个tcp代理服务器
概述
通过linux和C/C++来实现一个代理服务器并不是那么容易,不仅要考虑内存管理和性能,还需要考虑同步和线程/进程管理等问题。为了保证性能,有时候还需要考虑和被代理的服务器保持长连接,这样就需要对链接进行管理。那么使用Go来实现一个代理服务器会如何呢?
首先,通过Go来实现后台服务时至少有以下一些优势:协程可随用随起,内存管理和回收不需要自己来做。这样,再加上Go提供的一些工具函数,极大...
Go并发编程—sync包之Once
概述
Once可以让一个动过只发生一次,不管该动作在多少个协程中执行。这种操作可以用于在多线程编程中只允许运行一次的代码块,或初始化代码块中。
函数介绍
func (o *Once) Do(f func())
Once结构的实现
// Once is an object that will perform exactly one action.
type Once str...
Kafka设计原理--性能上的设计考虑
概述
本文总结了Kafka的一些设计原则和思想。通过本文,可以了解,为什么kafka的读写性能如此之高,在设计时考虑了那些方面。
性能上的设计考虑
使用批量传输和读写
在效率上Kafka做了很大的努力。它考虑的主要场景是:高吞吐写和高并发读。也就是,在大量的写数据和多方读取数据的场景,kafka尽量使得读和写付出的代价最小。那么,它是如何做到的呢?
我们知道,大量小数量的网络I/O和服务...
Kafka设计原理--生产者和消费者的设计
概述
本文说明了Kafka的生产者和消费者的设计原则,通过本文可以了解生产者和消费者的设计原理和思想,为更好的理解Kafka的运行机制打下基础。
生产者(Producer)的设计
生产则的设计考虑了两个方面:
如何实现负载均衡
如何提高I/O效率
负载均衡
生产者(Producer)把数据直接发送到Partition的leader所在的Broker服务器,而不经过任何的路由层。为了...
Beanstalk源码分析--数据结构设计
概述
beanstalk是多年前使用过的一个分布式任务队列,通过C实现,十分高效。和Redis(默认)的事件驱动框架一样,都是通过异步的epoll来实现,所以,能够高效的处理大量请求。
但不知什么原因,作者几年前已经不再维护其代码了。但我发现国内还是有一些人在使用该软件,为了能够更好的理解其运行机制,几年前对其代码进行了一些研究。先把分析的几篇发出来。
另外,我对其代码进行了fork,若有问...
Beanstalk源码分析--系统初始化
概述
本文接上文,继续分析和探讨beanstalk的实现原理。本文对beanstalk的启动过程做一个分析,这样可以对其运行框架有一个总体上的把握。
beanstalkd是使用epoll作为事件处理框架,为什么epoll如此高效,可以参考我以前写的一篇对其实现代码分析的文章。
源码分析
软件入口
beanstalkd的初始化流程代码非常简洁。主要完成各种数据结构的初始化,创建服务器监听s...
beanstalkd源码分析--事件处理机制
概述
本文接着讲述beanstalkd的事件处理机制,这其实也是大多数服务器要实现的步骤。我们且看beanstalkd是如何实现的。
源码分析
接受客户端连接
在主服务函数:void srvserve(Server *s)中初始化时,会把sock.f设置成srvaccept。
该函数主要是用来接受来自客户端的连接请求。
void
srvserve(Server *s)
{
...
beanstalkd源码分析--命令处理流程
概述
本文讲述了beanstalk的命令处理流程。
处理客户端连接请求
前面已经讲过,当服务启动时会把处理函数设置成srvaccept,用来建立客户端的tcp连接请求。
void
srvserve(Server *s)
{
...
// 设置处理函数
s->sock.f = (Handle)srvaccept;
...
// 进入死循环...
Kafka设计原理--日志复制,日志压缩,副本管理
概述
本文讲述了kafka在其他方面,比如:消息传递语言,数据复制,数据压缩等方面的设计思想。
消息传递语义
一般来说可以提供多种消息传递的语义保证:
(1) 最多一次:消息可能会丢失,但不会重新传递。
(2) 至少一次:消息永远不会丢失,但可能会重新传递。
(3) 保证正确的一次:这是真正想要的,每个消息都传递一次,只有一次。
从这些语义来看,这里有两个问题:
(1) 保证p...
Go并发编程—select的使用
概述
本文描述了select的用法,通过select可以监听多个channel的读写事件。这很类似于linux系统编程的select函数。但在Go中,实现的机制明显是不同的。linux系统编程的select是轮训的机制,而且监控的是文件描述符,且有数量的限制。Go中的select和channel配合使用,监控的是channel的读写状态。
select的要点
select会阻塞在多个c...
Go并发编程—pipeline模型的实现
概述
本文讲述了流水线作业的另一种实现方式。这种方式完全是基于Go语言本身的特性来实现。
实现说明
pipeline的实现方式其实可以有多种,在C系统编程中是通过管道(pipe)来实现,但由于进程是很重量级的实体,在创建(fork)时会非常消耗系统资源,所以在linux系统编程中一般会启动固定数量的进程/线程,每个进程完成固定的工作,并通过管道进行连接,形成流水线作业(pipeline)...
kafka源码分析—Controller
概述
本文描述了kafka的controller的实现原理,并对其源代码的实现进行了讲解。
controller运行原理
在Kafka集群中,controller多个broker中的一个(也只有一个controller),它除了实现正常的broker的功能外,还负责选取分区(partition)的leader。
第一个启动的broker会成为一个controller,它会在Zookee...
java中 Excel文件数据的导入
2018年6月27日由于工作原因需要写一个 获取Excel数据 然后存入数据库的功能。1.获取前台文件2.处理Excel数据3.存入数据库中Controller例:importBatchData(CommonDomain conn, String proId, @RequestParam("txt_file") MultipartFile file)其中@RequestParam("txt_fil...
java中 EXCEL的写入和导出
需求:有EXCEL模板1.获取Excel模板文件File templateFile=new File(文件路径+文件名);2.获取文件的扩展名String extension=getFileExtension(templateFile.getName());/**
* 获取文件扩展名
* @param fileName
* @return
*/
protected String ...
React 事件 传参
绑定事件用 bind方法,第一个参数是 this,第二个参数是需要传入的值如下: <a onClick={this.updateLabel.bind(this,'参数1','参数2')} >编辑</a> 接收参数如 输出如下: 套路如下: 工作总结,如有不正确地方,还望大神指点一二
Foundation 框架
前言 框架是由许多类、方法、函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易。 Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架。 Cocoa :是指 Foundation 、Core Data 和 AppKit(Application Kit)框架。用于 Mac OS X 设备上的应用程序开发。 Cocoa Touch :是指 Foundation 、Core Data 和 UIKit 框架。用于 iOS 设备上的应用程序开发。 1、各类之间
[TJOI2017]城市(树的直径)
[TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作。这个地区一共有ri座城市,《-1条高速公路,保证了任意两运城市之间都可以通过高速公路相互可达,但是通过一条高速公路需要收取一定的交通费用。小明对这个地区深入研究后,觉得这个地区的交通费用太贵。小明想彻底改造这个地区,但是由于上司给他的资源有限,因而小明现在只能对一条高速公路进行改造,改造的方式就是去掉一条高速公路,并且重新修建一条一样的高速公路(即交通费用一样),使得这个地区的两个城市之间的最大
今日推荐
周排行