技术选型:为什么批处理我们却选择了Flink

最近接手了一个改造多平台日志服务的需求,经过梳理,我认为之前服务在设计上存在缺陷。经过一段时间的技术方案调研,最终我们决定选择使用 Flink 重构该服务。 目前重构后的服务已成功经受了国庆节流量洪峰的考验,今日特来总结回顾,和大家分享一下经验。 业务需求及背景 在了解改造服务的需求前,我们首先要明确,要解决什么问题以及目前的服务是如何解决的。 当前的业务逻辑还是比较清晰的: 采集同一时段不同数据源的日志; 对采集的数据进行处理; 将处理后的数据上传到指定位置,供客户下载。 我们面临的痛点和难点...阅读全文

简书 2020-10-28 19:32:52 又拍云

密码学入门之密码

最近在研读《图解密码技术》这本书,将有一系列的密码学学习笔记,涉及到密码的相关概念、对称加密、非对称加密、单向散列函数、消息认证码、数字签名、数字证书等内容,同时涉及到代码部分也会使用Golang进行展示,感兴趣的可以关注更新哦。好了,今天先讲讲密码学中的一些概念性的问题。 1.密码学简介 2.对称加密 3.分组加密模式 4.非对称加密 5.单向散列函数 6.消息认证码 7.数字签名 8.证书 9.SSL/TLS 发送者、接收者和窃听者 请想象一个Alice向Bob发送电子邮件的场景。在这个场景...阅读全文

linux下定位多线程内存越界问题实践总结

最近定位了在一个多线程服务器程序(OceanBase MergeServer)中,一个线程非法篡改另一个线程的内存而导致程序core掉的问题。定位这个问题历经曲折,尝试了各种内存调试的办法。往往感觉就要柳暗花明了,却发现又进入了另一个死胡同。最后,使用强大的mprotect+backtrace+libsigsegv等工具成功定位了问题。整个定位过程遇到的问题和解决办法对于多线程内存越界问题都很典型,简单总结一下和大家分享。现象core是在系统集成测试过程中发现的。服务器程序MergeServer...阅读全文

简书 2020-10-28 15:42:29 linux大本营

熔断原理与实现Golang版

在微服务中服务间依赖非常常见,比如评论服务依赖审核服务而审核服务又依赖反垃圾服务,当评论服务调用审核服务时,审核服务又调用反垃圾服务,而这时反垃圾服务超时了,由于审核服务依赖反垃圾服务,反垃圾服务超时导致审核服务逻辑一直等待,而这个时候评论服务又在一直调用审核服务,审核服务就有可能因为堆积了大量请求而导致服务宕机 <img src="https://raw.githubusercontent.com/tal-tech/zero-doc/main/doc/images/call_chain.png...阅读全文

简书 2020-10-28 12:32:39 kevwan

2020-10-28 最近折腾了一下Julia

不要百度Julia,八成会有惊吓 我说的Julia是这个 - MIT 2012年推出的一门统计学语言。我最开始对这东西不怎么感冒,之前也看过很多现代化语言的语法,包括kotlin、golang、rust和julia。 其中,最喜欢的还是golang和kotlin。rust对我来说太复杂了,试了试就放弃了。 julia给我的感觉也差不多,语法像是几门语言的杂糅。 C:function和end关键字,写Python和go,甚至是R习惯了,经常漏写end Python:主要是类似numpy的矩阵操作 ...阅读全文

简书 2020-10-28 12:32:39 zhym1992

Go基础编程:变量、常量、命名

变量概念:变量是编程语言的最基本的组成元素,是一种占位符,用于引用计算机内存地址,可以存储计算结果或能表示结果,在程序运行期间内容改变的量。变量类型Go语言变量可以分为值类型和引用类型两种类型。值类型:包含 int、float、bool、string ,变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放。引用类型:有slice、map、chan、struct、interface、指针和函数,变量存储的是地址,这个地址对应的空间才是真正的存储数据,内存分配一般在堆上,通过GC回收。变量声明...阅读全文

Segmentfault 2020-10-29 02:32:37 一夕烟云

熔断原理与实现Golang版

在微服务中服务间依赖非常常见,比如评论服务依赖审核服务而审核服务又依赖反垃圾服务,当评论服务调用审核服务时,审核服务又调用反垃圾服务,而这时反垃圾服务超时了,由于审核服务依赖反垃圾服务,反垃圾服务超时导致审核服务逻辑一直等待,而这个时候评论服务又在一直调用审核服务,审核服务就有可能因为堆积了大量请求而导致服务宕机由此可见,在整个调用链中,中间的某一个环节出现异常就会引起上游调用服务出现一些列的问题,甚至导致整个调用链的服务都宕机,这是非常可怕的。因此一个服务作为调用方调用另一个服务时,为了防止被...阅读全文

Segmentfault 2020-10-29 02:32:37 kevinwan

Golang Channel原理

Channel是Golang实现CSP的核心。 基于channel通信主要涉及buf(数据)和sendq、recvq(维护阻塞的G),lock保证并发访问安全; 本质是一个基于环形缓存的有锁队列,但G的阻塞是在用户空间; 图片来源:https://i6448038.github.io/2019/04/11/go-channel/ 目录 新建channel 发送数据 协程直接发送数据 接收数据 协程直接接收数据 关闭channel Select原理 新建channel channel的运行时结构是...阅读全文

简书 2020-10-28 01:32:40 梦工厂

Golang中time包用法及一些注意事项

在我们日常软件开发过程中,经常会用到与时间相关的各种业务需求,下面来介绍 golang 中有关时间的一些基本用法,这里主要从 time 的几种 type 来开始介绍,以及使用中一些注意事项。 时间可分为时间点与时间间隔,golang 中time包也不例外,提供了以下两种基础类型 时间点(Time) 时间间隔(Duration) 除此之外 golang 也提供了以下类型,做一些特定的业务 时区(Location) Ticker Timer(定时器) 本文将按以上顺序来介绍 time 包的使用。 时...阅读全文

简书 2020-10-28 00:32:39 不屈真实

Golang错误处理机制

错误处理 1. error接口 Go语言引入了一个关于错误处理的标准模式。即error接口,该接口定义如下: type error interface { Error() string } 对于大多数函数,如果要返回错误,都可以按照如下方式返回,将error作为多重返回值的最后一个, 但这并不是强制的要求。 func Foo(param int) (n int, err error) { } n, err := Foo(0) if err != nil { //错误处理 } else { //使...阅读全文

简书 2020-10-27 21:32:39 ShawnLee_123

Golang 学习总结(1) - 关键字

前言 最近看完了两本golang的书,也使用golang搭建了一个框架,写了一个物联网项目 所以来做个入门总结 关键字 golang 一共有25个关键字 ,不能用作标识符,分成三大类,程序包管理、实体声明和定义、流程控制 如果有其它语言基础,大部分都可以知道其功能 程序包管理: package package用于声明包的名称,需放在go文件所有代码的最前面。一个包由一个或多个go源文件组成,需放在同一个目录下,且同一个目录下的这些go文件的package的名字只能有一个 import 包引入 其...阅读全文

简书 2020-10-27 19:32:39 skygrey

C/C++ Linux 后台服务器开发高级架构师学习知识点路线总结

前言:小编也是从事c方面10多年的工作经验、今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线。从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架构师。想必大家都知道从事后台开发首先就是要选择一种语言,小编今天跟大家分享是用C/C++ 做的后台开发。所以想从事这方面的朋友得有C/C++的基础。首先跟大家说的是从学习步骤:(Linux入门到精通篇)一、Linux开发环境1.了解Linux环境搭建,了解LinuxC编程2.了解Linux安装,命令使...阅读全文

Segmentfault 2020-10-29 02:32:37 Linux服务器开发

一篇理解什么是CanSet, CanAddr?

# 一篇理解什么是CanSet, CanAddr? # 什么是可设置( CanSet ) 首先需要先明确下,可设置是针对 reflect.Value 的。普通的变量要转变成为 reflect.Value 需要先使用 reflect.ValueOf() 来进行转化。 那么为什么要有这么一个“可设置”的方法呢?比如下面这个例子: ``` golang var x float64 = 3.4 v := reflect.ValueOf(x) fmt.Println(v.CanS...阅读全文

Go语言中文网 2020-10-27 12:38:41 jianfengye110

加密算法推荐清单

1. 背景 文中所列出的推荐算法皆已经过全世界密码学家验证和各国际标准化组织认证, 并在市场中广泛应用, 有望在未来足够长的时间内保证安全性和实现性能。 2. 密码学家的工具箱 2.1 散列算法 散列算法是密码学算法中非常重要的一个分支, 通过对所有数据提取指纹信息以实现数据签名、 数据完整性校验等功能。 用于消息唯一性和数据完整性验证的散列函数, 其安全性依赖于函数本身的属性和对抗碰撞的抵抗, 因此散列函数的选择至关重要。 MD 系列函数已宣告破解, 可被轻易伪造, 不能作为安全散列函数使用。...阅读全文

Golang interface

接口在Golang中表示一种抽象的数据类型,它用来定义对象的行为,具体的实现由对象决定。程序编写时如果仅仅定义接口是没有实际意义的,我们需要自定义类型,如果类型对某个接口的所有方法提供了定义,就说这个类型实现了该接口。 定义接口 Golang中接口的定义使用interface关键字,后面紧跟一个大括号,里面包含若干函数(参数和返回值不是必需的),比如, type People interface { GetName() string // 带有返回值的方法 GetAge(id int) // 带...阅读全文

简书 2020-10-26 22:32:41 aneirin