今日头条在消息服务平台和容灾体系建设方面的实践与思考

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。 业务背景 今日头条的服务大量使用微服务,容器数目巨大,业务线繁多, Topic 的数量也非常多。另外,使用的语言比较繁杂,包括 Python,Go, C++, Java, JS 等,对于基础组件的接入,维护 SDK 的成本很高。 引入 RocketMQ 之前采用的消息队列是 NSQ 和 kafka , NSQ 是纯内存的消息队列,缺少消息的持久性,不落盘直接写到 Golang 的 cha...阅读全文

go 中的包 和 规范

1.go 包的概念 把相同的功能放到一个目录,称之为包 包可以被其他的包引用 main包用来生成可执行文件,每个程序只有一个main包 包可以提高代码的可复用性 2. go的规范 golang的变量函数命名需要使用驼峰命名法,且不能出现下划线, 文件名使用下划线 golang中根据首字母的大小写来确定可以访问的权限。无论是方法名、常量、变量名还是结构体的 名称,如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用可以简单 的理解成: 首字母大写是公有的,首字母小写是私有的文件...阅读全文

Beego脱坑(三)Router

title: Beego脱坑(三)Router tags: go,beego author : Clown95 beego中的路由的主要功能是实现从请求地址到实现方法 ,简单的说就是路由就是能够自动匹配url地址,并调用相应的控制器处理信息。 在之前创建beego项目中,我们为了完成hello world的输出,在 router.go 中添加了 beego.Router("/hello",&controllers.HelloControllers{}) 我们这段代码的意思就是把 /hello 这...阅读全文

双十一too many open files修复

前置 原来一直没有遇到过高并发的场景, 这一次双十一说实话挺忐忑的,心里慌得一批. 架构的话大致是用supervisor来启动golang的服务,接着用nginx做负载均衡 这个项目用的是go的iris框架,主要是一个淘宝转链的接口,请求原来一天差不多300万的请求量,qps差不多就是150左右. 说实话原来没怎么压测过哈哈哈,觉得业务简单,感觉这个流量下来对go完全是没压力啊. 所以双十一的准备是加了台服务器. 谁知道10号那天8点多开始暴增.. 整天的数据差不多是850w,接近原来的3倍。 ...阅读全文

go语言基础知识汇总

一、go语言简介 天然支持高并发 内存自动回收,不需要开发人员管理内存 支持管道,从而支持多个协程之间通信 多返回值,一个函数可以允许多个返回值 异常和错误的区分,异常是不能预料到的事情发生了,错误是预料到的事情发生了。 二、理解gopath gopath go项目的工作目录,目录下面包含三个目录,src,pkg,bin goroot go源码的安装路径 gobin 存放go编译后生成的可执行文件 go get 执行go get会把源码放在第一个gopath的src目录下面 三、go基础知识 3...阅读全文

51CTO博客 2019-11-17 11:24:51 PowerMichael

面向未来微服务:Spring Cloud Alibaba从入门到进阶

​Spring Cloud Alibaba微服务从入门到进阶[完整无密]Spring Cloud Alibaba是阿里巴巴出品的Spring Cloud第二代实现,是阿里微服务的解决方案与精华沉淀,在业界广泛使用,使用微服务更是大势所趋。学习本课程,能熟练掌握Spring Cloud Alibaba的使用和原理,并带领大家从0开始编写一个学习笔记微信小程序,在实践中深入理解微服务思想。适合人群对微服务开发有兴趣有需求的开发人员技术储备要求具有一定开发经验了解Maven / 了解Spring Bo...阅读全文

Go语言中文网 2019-11-18 01:00:23 xiaoshuibei

你好,Go语言

本文是「vangoleo的Go语言学习笔记」系列文章之一。 官网: www.vangoleo.com/go/hello-go… 我在2015年第一次接触Go语言,完成了Hello World,随后也一直在关注这门新语言。至今,Go语言发展已经过去十年多了,越来越受到广大开发者的关注,而且随着云原生、IoT、区块链的流行,Go似乎要成为21世纪的第一语言。Docker、Kubernetes、以太坊等重量级的项目都是基于Go开发。 Go语言是Google公司在2009年开源的一门高级编程语言,它为解...阅读全文

掘金 2019年11月16日 vangoleo

深入理解Golang之http server

前言 对于Golang来说,实现一个简单的http server非常容易,只需要短短几行代码。同时有了协程的加持,Go实现的http server能够取得非常优秀的性能。这篇文章将会对go标准库net/http实现http服务的原理进行较为深入的探究,以此来学习了解网络编程的常见范式以及设计思路。 HTTP服务 基于HTTP构建的网络应用包括两个端,即客户端(Client)和服务端(Server)。两个端的交互行为包括从客户端发出request、服务端接受request进行处理并返回respon...阅读全文

掘金 2019年11月17日 Turling_hu

Golang 关于通道 Chan 详解

goroutine 首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。 下面我们先来看一个例子吧 import( "fmt" ) func main(){ go fmt.Println("1") fmt.Println("2") } 在golang里面,使用go这个关键字,后面再跟上一个函数就可以创建一个线程。后面的这个函数可以是已经写好的函数...阅读全文

全局唯一ID - snowflake

为什么需要全局唯一ID 比如以下 分布式下唯一ID 如果数据库分了库/表, 那么表的自增主键就不再唯一, 这时候就需要一个全局唯一的ID生成器才能保证唯一. 可以用来作为事务ID等需要保证唯一的业务 (事务ID可以用来确保幂) 预生成ID 有些业务下需要提前生成唯一ID, 这也是表的自增主键不能满足的需求. snowflake 生成全局唯一ID有多种方法(可以搜到), 比如使用额外的数据库或者UUID, 但笔者认为性能更好 适用性更广的是snowflake算法. snowflake是witter...阅读全文

读代码之golang装饰器模式

在v站看到一篇文章,说到了golang实现python装饰器的方法,有两个实现方式 其中一种是用类方式实现的,当时泛览了下代码,觉得 emmm...实现方式挺花哨的,貌似看懂了就没怎么在意,当时特意把代码复制到goland中作为参考了 某天上班摸鱼,仔细看了下这段代码,梳理细节后忽然发现没get到其中逻辑 郁闷很久未参透 有空就特意调试打印下这段代码 好几天才整明白,这大概就是菜比の理解能力了吧 代码如下: // with interface. which we need create a `p...阅读全文

深入内核架构--内存屏障

简介 之前在看golang gc、java gc及volatile 可见性的时候,经常会看到内存屏障,但是对于其基本原理似懂非懂,也对于内存屏障是如何保障多个CPU之间的数据可见性保持好奇,网上的博客基本上只是停留于表面,导致我产生了几个误区: 1. CPU之间内存数据可见性问题是由于cpu cache没及时同步数据导致的。 2. 内存屏障为啥能通过防止指令重排序,就能让cpu cache及时同步数据? 不过最近发现这只是表面现象!所以今天写一下这篇文章来彻底介绍一下内存屏障 CPU cache...阅读全文

go encoding/json 介绍

由于我一直是一名前端工程师,所以我会在前端的角度将js中的json操作和go中的操作做一个类比方便大家的理解。 将字符串转换为对象 js : JSON.parse(`{"name":"cfl"}`)go : json.Unmarshal jsonStr := `{ "name":"cfl", "age":10, "friend":[{"name":"sx", "age":10 }] }` type User struct { Name string Age int64 Friend []User...阅读全文

Segmentfault 2019-11-18 08:32:40 曹飞龙

时序数据库 InfluxDB(七)

相关文章:时序数据库 InfluxDB(一)时序数据库 InfluxDB(二)时序数据库 InfluxDB(三)时序数据库 InfluxDB(四)时序数据库 InfluxDB(五)时序数据库 InfluxDB(六) 单点故障和容灾备份 InfluxDB 开源的社区版本面临的最大的问题就是单点故障和容灾备份,有没有一个简单的方案去解决这个问题呢? 既然有单点故障的可能,那么索性写入多个节点,同时也解决了容灾备份的问题: 1、在不同的机器上配置多个 InfluxDB 实例,写入数据时,直接由客户端并...阅读全文

Segmentfault 2019-11-18 08:32:39 rife

【Golang小知识】new与make的区别

定义 func new(Type) *Type func make(t Type, size ...IntegerType) Type 其中Type代表某一个数据类型。 区别 1.返回值 从定义中可以看出,new返回的是指向Type的指针。make直接返回的是Type类型值。 2.入参 new只有一个Type参数,Type可以是任意类型数据。make可以有多个参数,其中第一个参数与new的参数相同,但是只能是slice,map,或者chan中的一种。对于不同类型,size参数说明如下: 对于sl...阅读全文

Segmentfault 2019-11-18 08:32:39 moonbamboo

聊聊 Go 语言中的字符表示与字符串遍历

和其他语言不同,在 Go 语言中没有字符类型,字符只是整数的特殊用例。 为什么说字符只是整数的特殊用例呢?因为在 Go 中,用于表示字符的 byte 和 rune 类型都是整型的别名。在 Go 的源码中我们可以看到: // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit uns...阅读全文

掘金 2019年11月17日 江五渣

Java程序员Go语言入门指南

为什么是Go语言 类C的语法,这意味着Java、C#、JavaScript程序员能很快的上手 有自己的垃圾回收机制 跨平台、编译即可执行无需安装依赖环境 支持反射 Go语言简介 Go 语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具Python等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。 数据类型 数据类型 说明 bool 布尔 string 字符串 int uint8,uint16,uint32...阅读全文

掘金 2019年11月16日 大猫猫酱

如何在Go中使用切片容量和长度

来做一个快速测验-以下代码输出什么? vals := make([]int, 5) for i := 0; i < 5; i++ { vals = append(vals, i) } fmt.Println(vals) 复制代码Run it on the Go Playground → play.golang.org/p/7PgUqBdZ6… 如果猜到了[0 0 0 0 0 0 1 2 3 4],那么你是正确的。 等一下为什么不是[0 1 2 3 4]? 如果答错了,也不担心。从其他语言过渡到G...阅读全文

掘金 2019年11月17日 kevinyan

如何在Go中使用切片容量和长度

来做一个快速测验-以下代码输出什么? vals := make([]int, 5) for i := 0; i < 5; i++ { vals = append(vals, i) } fmt.Println(vals) Run it on the Go Playground → https://play.golang.org/p/7Pg... 如果猜到了[0 0 0 0 0 0 1 2 3 4],那么你是正确的。 等一下为什么不是[0 1 2 3 4]? 如果答错了,也不担心。从其他语言过渡到G...阅读全文

Segmentfault 2019-11-18 08:32:38 KevinYan

Java-100天知识进阶-JVM内存-知识铺(三)

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。 Java内存模型(JMM) JVM内存模式是JVM的内存分区 Java内存模式是一种虚拟机规范 1. Jvm内存按照运行时态及内存规范划分 Java内存区域 2.1 线程安全 2.1.1 程序计数器 2.1.2 虚拟机栈 2.1.3 本地方法 2.2 线程不安全 2.2.1 方法区 2.2.2 堆包含如下图 2.2.3 堆内存划分 总结: 程序计算器是唯一不会 OOM区 堆是gc的主...阅读全文

Segmentfault 2019-11-18 08:32:38 知识铺