- 博客(16)
- 收藏
- 关注
原创 【分布式系统遨游】分布式计算
引言随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。怎么解决这个问题呢?当然是把这些问题分成多份,在不同的机器上去解决,众人拾柴火焰高嘛。而分布式计算就是将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。在分布式中,针对这种情况我们大概有两种计算模式:MapReduce和Stream,接下...
2020-05-03 20:13:29
414
原创 【分布式系统遨游】分布式通信
今天我们来讨论分布式通信技术。为什么需要分布式通信我们之前在讲分布式资源调度的时候,把分布式系统中的各个节点与操作系统的进程做了类比。我们知道,操作系统的进程之间由于需要数据的交换,是需要进程通信机制的。那么同理,分布式系统之间同样需要通信。在业务层面,每个分布式系统一般都承载着一个微服务,所以,微服务之间也一定是需要通信的。比如,我们各条业务线均需要查询用户中心微服务的数据等等。我们常用的通...
2020-05-03 20:12:28
465
原创 【分布式系统遨游】分布式资源调度
今天我们来讨论分布式资源调度。为什么需要资源调度从计算机演化说起我们知道,计算机的出现很大程度上是为了分担人类的工作的。所以,整个计算机体系架构的演化的过程,都离不开对任务与资源这两个因素的考虑。如何利用最少的资源,运行最多的任务,且耗时最短,这是一直以来伴随我们以及科学家的难题。对于单机系统来说,从最早的单道程序设计技术、到多道程序设计技术、到现在的多核并行架构,解决方案正在逐步进化,也就...
2020-05-03 19:53:30
1597
原创 【分布式系统遨游】分布式事务
引言对于我们网上购物的每一笔订单来说,平台都会有两个核心步骤:一是订单业务采取下订单操作,二是库存业务采取减库存操作。通常,这种不同业务会运行在不同的机器上边的,假设这两个动作是在同一台机器上发生的,我们进行操作的时候是不是需要保证订单操作和库存操作动作一致才能保证这个交易的准确性(通常我们用mysql事务来保证),如果这个问题放到了分布式结构中,我们是不是同样需要保证操作的正确性,那么这个问...
2020-05-03 19:52:24
208
原创 【分布式系统遨游】分布式经典架构
引言我们知道,分布式系统就是将具有独立计算能力的系统单元,部署在不同的机器上。那么,如何有效的管理这些机器之间的协同工作,就是一个很大的难题。目前,大体有两种典型的分布式系统架构:集中式与非集中式。集中式架构我们可以将分布式系统中的每一个节点比作操作系统中进程或者线程的概念。操作系统诞生的原因之一就是为了解决如何高效、合理的运行用户的多个任务请求。所以,操作系统对我们的任务请求抽象成一个个进...
2020-04-25 19:58:35
358
原创 【分布式系统遨游】分布式互斥与分布式锁
写在前面在工作学习中,我们常常听说分布式,集群,容器等等名词,但是当学妹们问你什么是分布式的时候,你是否有一种书到用时方恨少的感觉呢?为了在学妹面前“扬眉吐气”一把,今天开始,我们就去会一会分布式,Let’s go!为什么有分布式结构在我们了解为什么会有分布式结构之前,我们想学习一下什么是分布式结构。分布式就是一个业务分拆多个子业务,部署在不同的服务器上。举个例子,假设需要开发一个在线商城。...
2020-04-25 19:57:11
755
原创 【Go语言踩坑系列(十)】Channel(下)
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。引入有了上一篇文章的基础,这一节我们来看通道的底层实现,我们先看一个例子,相信你已经很熟悉了:func main() { ch := make(chan int) go func() { ch <- 1 }() time.Sleep(5 * time.Second) ...
2020-04-13 09:43:45
3199
原创 【Go语言踩坑系列(九)】Channel(上)
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。我们知道,Go实现了两种并发形式,第一种是多线程共享内存,其实就是Java,C++等语言的多线程并发,通过锁来进行访问。另一种则是Go特有的CSP(communicating sequential processes)并发模型。什么是CSP?CSP 是 Communicating Seq...
2020-04-13 09:42:41
1212
原创 【Go语言踩坑系列(八)】Goroutine(下)
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。引入还记得我们在上一篇文章中提到的例子吗:func main() { for i := 0; i < 10; i++ { go func() { fmt.Println(i) }() }}现在我们分析一下...
2020-04-06 16:39:22
283
原创 【Go语言踩坑系列(七)】Goroutine(上)
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。进程,线程到协程的发展计算机发展至今有几个至关重要的时期:1. 单任务时代这个时代主要标志为批处理。我们都知道早期的计算机就是穿孔打卡来运行的,需要人工去做输入输出的处理工作,计算机只进行了计算,而且每次都只能执行一个流程,然后循环往复,这个大流程下计算机很大程度上是没有执行的,所以...
2020-04-06 16:38:14
422
原创 【Go语言踩坑系列(六)】面向对象
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。问题思考为什么有结构体?首先,我们需要明确面向对象的思想是包含各种独立而又互相调用,这就需要一个承载的数据结构,那么这个结构是什么呢?很显然,在GO语言中就是结构体。其次,结构体作为一种数据结构,无论是在C还是C++还是Go都发挥了极其重要的作用。另外,在Go语言中其实并没有明确的面向...
2020-03-29 15:50:05
438
原创 【Go语言踩坑系列(五)】错误与异常处理
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。为什么需要错误和异常处理任何一行代码都可能存在不可预知的问题,而这些问题就是bug的根源。为了妥善处理这类问题,我们需要编写一些代码,这类代码被称为运维代码。通常情况下,我们需要发现问题、判断问题的种类、然后根据问题的种类,分别进行响应与处理。这些处理可能是写入日志、也可能是直接让代码停止...
2020-03-29 08:28:47
1142
原创 【Go语言踩坑系列(四)】字典
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。要点本文关注Go语言map相关的语言特性。map初始化与内存分配首先,必须给map分配内存空间之后,才可以往map中添加元素:func main() { var m map[int]int // 使用var语法声明一个map,不会分配内存 m[1] = 1 // 报错:assig...
2020-03-22 09:06:06
653
原创 【Go语言踩坑系列(三)】数组与切片
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。要点本文关注Go语言数组和切片相关的语言特性。数组和切片以及字符串的关系相同点Go语言中数组、字符串和切片三者是密切相关的数据结构。这三种数据类型,在底层原始数据有着相同的内存结构,在上层,因为语法的限制而有着不同的行为表现。差别Go语言的数组是一种值类型,虽然数组的元素可以被...
2020-03-22 09:04:24
320
原创 【Go语言踩坑系列(二)】字符串
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。要点本文关注Go语言字符串相关的语言特性、以及相关的[]byte、[]rune数据类型。从字符编码说起ASCII计算机是为人类服务的,我们自然有表示我们人类所有语言与符号的需求。由于计算机底层实现全部为二进制,为了用计算机表示并存储人类文明所有的符号,我们需要构造一个“符号” =&g...
2020-03-21 20:17:58
550
原创 【Go语言踩坑系列(一)】基本数据类型
声明本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。要点本文只关注Go语言的基本类型:如整型、浮点型、常量相关的内容。字符串、数组和切片等高级类型会在下一篇文章中讲述。包初始化顺序:当前包级别变量 -> 导入外部包的init() -> 当前包内的init() -> main()。通常可将一个包导入但是不使用的方式,初始...
2020-03-21 20:11:36
245
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人