转载

Java:golang兄,听说你天生高并发?

Java:golang兄,听说你天生高并发?

虽然是这样的标题没错,但是绝非语言大战,笔者本身是一个Java开发者,但说到底就是编程开发人员无疑,因此这并不阻碍我们去了解其它的语言,这就像有的人主食吃面,有的主食吃米,但是他们可以偶尔换个口味嘛(关于素食主义,emming,这不在笔者研究范围……)。

随着5G时代的逐渐到来,互联网公司势必迎来新一轮不小的升级,服务云化必定是大趋势,为了跟上时代步伐,在面试准备之余对云开发相关做了一些了解。在这一过程中,无意接触到了golang。

其实go语言在挺早前就听说过,坊间传说它“天生支持高并发,执行速度接近C,网络服务接近Nginx……”,尽管如此,进一步了解它依然拖沓到现在。

其它还好,当时唯一不理解的是“天生支持高并发”,尤其是“天生”二字,着实让人感到满满的高端和神秘。下面基于笔者初步的了解来解释一下这个疑问(说明可能不是很专业,读者将就吧,如果有更大的兴趣可以自行学习哈):

一句话总结:go语言在设计的时候从关键字层面实现了多协程开发,好像语言本身支持高并发一样。

(协程可以看做是轻量级的线程,即用户级别的线程,系统线程(比如Java中的thread)属于重量级的线程,协程依赖于线程。Java目前为止并没有支持协程)

在go中实现并发操作到底有多简单(你可以回想一下c语言实现协程),来看代码:

func main () {

go add( 3 , 6 )  

go add( 1 , 6 )  

time.Sleep(time.Second)

}

func add (a  int ,b  int ) {

result := a+b

fmt.Println(result)

}

go关键字实现了协程开辟调用,如果不进行等待,主线程结束,协程就会马上结束。

不知道看到这里大家有没有理解go在高并发开发中的优势,goroute和channel的模式实现了类似Unix的epoll模型,因此对于一些耗时任务执行是非常有优势的。

那在接口服务方面,go和Java到底是谁更快呢?

为此笔者进行了相关测试,环境如下:

GoSDK1 .8 ;框架: beegosqlx1 .4

JavaJDK1 .8 ;框架: springboot2 .0springMVCjdbctemplate (没有使用重量级的 ROM 框架)

ApacheJMeter

均为请求返回json数据  http://127.0.0.1:8080/user

我们个测试十次,然后取平均值

Java:golang兄,听说你天生高并发?

上方的表格就是总体的参数了,ApacheJMeter 配置:线程数1000 setup:1 循环次数:2,二者的error都为0.00%。

可以看出,go的吞吐比Java多出17%左右。

那到这里,很多Java开发者就有点伤心了,这这这……

其实,还是那句老话:“语言之间没有优劣,重要的是用途。”Java的强项在于构建大型项目的整体,更容易实现分布式。在我看来,go在整个体统的某一块会有更好的性能,比如云文件存储、中间件开发,需要处理的逻辑密集度越高,go的优势会越明显,对于系统整体可用性来说,常规的数据访问使用Java可能是更好的选择。

另外关系型数据库是go的主要瓶颈,因为从理论上来说它可以接近nginx的http服务速度,因此,在一些极高并发系统设计,可以考虑使用go结合redis进行重构,比如电商中的秒杀系统。

END

【推荐阅读

绝了!Dataway让SpringBoot不在需要Controller、Service了

不要网上乱拷贝代码了!一段网上找的代码突然炸了!

如何搭建一款自己的私有百度网盘?

我把SpringBoot项目从18.18M瘦身到0.18M,部署起来真省事!

项目实践:三招组合拳,手把手教你打出优雅的后端接口

我把SpringBoot的banner换成了美女,老板说工作不饱和,建议安排加班

SpringBoot + Redis + 注解 + 拦截器 实现接口幂等性校验

推荐三个 Vue 后台管理模版,配合 Spring Boot 使用真香!

Java:golang兄,听说你天生高并发?

原文  http://mp.weixin.qq.com/s?__biz=MzU3NDE0NjMwNw==&mid=2247487110&idx=2&sn=d891e4391851d84923c6de1ee0e7039b
正文到此结束
Loading...