自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

稻草人技术博客

Keep Calm and Carry On

  • 博客(582)
  • 收藏
  • 关注

转载 读懂阻塞,非阻塞,同步,异步

我们来总结一下阻塞、非阻塞,同步和异步这两组概念。阻塞调用会一直等待远程数据就绪再返回,即上面的阶段1会阻塞调用者,直到读取结束。而非阻塞无论在什么情况下都会立即返回,虽然非阻塞大部分时间不会被block,但是它仍要求进程不断地去主动询问kernel是否准备好数据,也需要进程主动地再次调用recvfrom来将数据拷贝到用户内存。同步方法会一直阻塞进程,直到I/O操作结束,注意这里相当于上面的阶段1,阶段2都会阻塞调用者。

2023-04-11 20:14:29 240

转载 MySQL的索引为什么使用B+树而不使用跳表?

B+树是多叉平衡搜索树,扇出高,只需要3层左右就能存放2kw左右的数据,同样情况下跳表则需要24层左右,假设层高对应磁盘IO,那么B+树的读性能会比跳表要好,因此mysql选了B+树做索引。redis的读写全在内存里进行操作,不涉及磁盘IO,同时跳表实现简单,相比B+树、AVL树、少了旋转树结构的开销,因此redis使用跳表来实现ZSET,而不是树结构。存储引擎RocksDB内部使用了跳表,对比使用B+树的innodb,虽然写性能更好,但读性能属实差了些。在读多写少的场景下,B+树依旧YYDS。

2023-02-15 11:08:11 787

转载 SkipList跳表详解

跳表是可以实现二分查找的有序链表;每个元素插入时随机生成它的level;最底层包含所有的元素;如果一个元素出现在level(x),那么它肯定出现在x以下的level中;每个索引节点包含两个指针,一个向下,一个向右;(笔记目前看过的各种跳表源码实现包括Redis 的zset 都没有向下的指针,那怎么从二级索引跳到一级索引呢?留个悬念,看源码吧,文末有跳表实现源码)跳表查询、插入、删除的时间复杂度为O(log n),与平衡二叉树接近;

2023-02-14 19:31:43 414

转载 Tonic 基于Rust的gRPC实现

我们第一步需要做的是使用定义gRPC服务以及请求和相应的类型。我们将这个定义文件.proto放进crate根目录下的一个子目录中。需要注意的是,Tonic对.proto定义文件的位置并没有严格的要求。然后你需要在服务定义中定义RPC方法,并且指定它们的请求与相应类型。gRPC允许你定义4种不同的服务方式,Tonic都可支持。在这个入门指导中,我们只使用简易的RPC。首先,我们需要定义包的名称,当在你的客户端——服务器应用中引用proto文件时,Tonic会通过这个包名称来搜索。这里,我们叫它。

2022-12-23 15:03:21 1116

转载 吴恩达:机器学习的六个核心算法

吴恩达在其创办的人工智能周讯《The Batch》上更新了一篇博文,总结了机器学习领域多个基础算法的历史溯源。文章开头,吴恩达回忆他的研究历程中曾有一次抉择:多年前,在一次项目中,选择算法时,他不得不在神经网络与决策树学习算法之间做选择。考虑到计算预算,他最终选择了神经网络,在很长的一段时间内弃用增强决策树。这是一个错误的决定,「幸好我的团队很快修改了我的选择,项目才成功。」吴恩达谈道。他由此感叹,不断学习与更新基础知识是十分重要的。

2022-11-08 12:23:07 208

转载 如何设计一个对外的安全接口

如何保证外网开放接口的安全性?使用加签名方式,防止数据篡改信息加密与密钥管理搭建OAuth2.0认证授权使用令牌方式搭建网关实现黑名单和白名单令牌方式搭建搭建API开放平台方案设计:第三方机构申请一个appId,通过appId去获取accessToken,每次请求获取accessToken都要把老的accessToken删掉第三方机构请求数据需要加上accessToken参数,每次业务处理中心执行业务前,先去dba持久层查看accessToken是否存在(可以把accessToke

2022-02-24 22:20:46 335

转载 理解Linux cpu 状态

使用Ganglia监控整个Hadoop集群,看到Ganglia采集的各种指标:CPU各个具体的指标含义解释如下:①CPU(监测到的master主机上的CPU使用情况)从图中看出,一共有五个关于CPU的指标。分别如下:ⓐ UserUser表示:CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有:Shells、数据库、web服务器……ⓑ NiceNice表示:可理解为,用户空间进程的CPU的调度优先级,范

2022-02-24 21:37:35 350

转载 分布式事务的四种解决方案

简述分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。解决方案在分布式系统中,要实现分布式事务,无外乎那几种解决方案。一、两阶段提交(2PC)两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。1. 运行过程1.1 准备阶段协调者询问参与者事务是否执行成功,参与者发回事务执行结果。1.2 提交阶

2022-02-24 21:33:52 236

转载 Flink和kafka的数据一致性

Flink消费kafka数据起始offset配置:Flink读取Kafka数据确定开始位置有以下几种设置方式:flinkKafkaConsumer.setStartFromEarliest():从topic的最早offset位置开始处理数据,如果kafka中保存有消费者组的消费位置将被忽略。flinkKafkaConsumer.setStartFromLatest():从topic的最新offset位置开始处理数据,如果kafka中保存有消费者组的消费位置将被忽略。flinkKafkaConsume

2021-12-28 22:37:46 1402

转载 Flink Checkpoint 原理流程以及常见失败原因分析

前言目前有赞实时任务主要以 Flink 为主,为了保证实时任务的容错恢复以及停止重启时的状态恢复,几乎所有的实时任务都会开启 Checkpoint 或者触发 Savepoint 进行状态保存。由于 Savepoint 底层原理的实现和 Checkpoint 几乎一致,本文结合 Flink 1.9 版本,重点讲述 Flink Checkpoint 原理流程以及常见原因分析,让用户能够更好的理解 Flink Checkpoint,从而开发出更健壮的实时任务。一、 什么是 Flink Checkpoint 和

2021-12-28 22:28:29 3717

转载 MyBatis config.xml配置示例

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd" ><configuration> <!-- Settings 必须放到最上面 --> <settings> <!-- 该配置影

2021-12-28 21:29:31 416

转载 Flink RichFunction

在IDEA中展示RichSinkFunction的继承关系层次结构图:蓝色实线:extends继承一个抽象类绿色实线:extends继承一个类绿色虚线:implements实现一个接口Function接口是所有用户自定义函数的base interface,RichFunction和SinkFunction都是继承Function的接口。可以看到,SinkFunction和RichFunction接口中有各有不同的方法,而后者的方法更丰富一些,功能也就越多,所以称为“富函数”。RichFunc

2021-11-20 18:16:48 1504

转载 Flink Context到底是什么?

Context ,又称执行上下文,特别抽象的一个东西,今天特地记录一下 Flink Context 到底是什么?有什么作用?不至于每天使用 Flink,总感觉云里雾里的Flink Context 总共可以分为三种:StreamExecutionEnvironment、RuntimeContext、函数专有的Context我们先看第一类:StreamExecutionEnvironmentStreamExecutionEnvironment 包括 LocalStreamEnvironment、Remo

2021-11-20 18:05:59 452

转载 LRU 实现原理

前言我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来。缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据。常用淘汰算法有 LRU,LFU,FIFO,这篇文章我们聊聊 LRU 算法。LRU 简介LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓存容量的满时候,优先淘汰最近很少使用的数据。假

2021-10-01 21:05:30 2075

转载 图解可观测Metrics, tracing, and logging

最近在看Gophercon大会PPT的时候无意中看到了关于Metrics,Tracing和Logging相关的一篇文章,凑巧这些我基本都接触过,也是去年后半年到现在一直在做和研究的东西。从去年的关于Metrics的goappmonitor,到今年在排查问题时脑洞的基于log全链路(Tracing)追踪系统的设计,正好是对这三个话题的实践。这不禁让我对它们的关系进行思考:Metrics和Logging的区别是什么?Tracing还需要Logging吗?我们什么时候需要Metrics?它们之间有什么关联?这.

2021-08-09 23:32:34 717

转载 Flink任务重启策略

概述Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启:1.策略固定间隔 (Fixed delay)2.失败率 (Failure rate)3.无重启 (No restart)如果没有启

2021-06-26 16:15:55 1017

转载 FlinkKafkaConsumer重复消费数据问题

问题这有两个相同代码的程序:val Env = StreamExecutionEnvironment.getExecutionEnvironmentEnv.setRestartStrategy(RestartStrategies.noRestart())val consumerProps = new Properties()consumerProps.put("bootstrap.servers", brokers)consumerProps.put("group.id", "test1234"

2021-06-26 14:13:59 4775 5

原创 Mybatis动态传入database

方法一:使用动态urlmybatis-config.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <properties> <pr

2021-06-23 16:26:46 370

原创 Java http请求示例

使用HttpURLConnectionpublic static String httpGet(String host) { HttpURLConnection connection = null; try { URL url = new URL(host); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET");

2021-06-16 21:13:21 669

转载 分布式系统一致性问题与Raft算法

什么是分布式一致性问题首先,什么是分布式系统一致性问题?分布式系统这个词应该不用多解释,简单地说就是由多个节点(一个节点即一台物理机器或一个进程),异步得通过网络通讯而组成的系统。而一致性(Consistency),这个词在不同的场景下有不同的含义,比方说大家比较熟的应该是在关系型数据库中事务的一致性。但在分布式系统中,一致性的基本含义是对进行进行一个或多个操作指令之后,系统内的其他成员对这些操作指令的结果能够达成共识,也就是对结果的看法是一致的。举个例子,比方说有多个客户端,这些客户端出于某种原因,

2020-11-20 17:25:12 632

转载 sarama 源码学习

ConsumerGroupKafka 消费的过程似乎大致上可以分为 ConsumerGroup 的 Rebalance 协议和 Partition 消费协议两部分,这里先看 ConsumerGroup 部分。ConsumerGroup 的 Rebalance 是 Kafka 消费侧扩展性的体现,通过将 Partition 分配给 Consumer 实现扩展消费能力,在增加 Consumer 时执行 Rebalance,将 Partition 重新均摊给新加入的 Consumer,是一个 pre-shar

2020-11-10 15:43:59 2625 1

转载 Go 函数选项模式

Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置.在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了. 那么你如何创建一个函数, 用户可以指定一些额外的配置?有很多可能的方法可以做到这一点, 但是大

2020-10-28 17:50:56 334

转载 如何实现一个延迟队列

前言延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案。前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因此我也在网上调研了一系列不同的延迟队列的实现方案,在此进行了一个总结并且给大家进行分享。延迟队列定义首先,队列这种数据结构相信大家都不陌生,它是一种先进先出的数据结构。普通队列中的元素是有序的,先进入队列中的元素会被优先取出进行消费;延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在

2020-10-26 20:36:57 1430 1

转载 Go中json.Unmarshal对数字类型的处理

JSON的规范中,对于数字类型,并不区分是整型还是浮点型。对于如下JSON文本:{ "name": "ethancai", "fansCount": 9223372036854775807}如果反序列化的时候指定明确的结构体和变量类型package mainimport ( "encoding/json" "fmt")type User struct { Name string FansCount int64}func m

2020-10-20 11:34:42 3848 1

转载 Go context 超时控制

常见方法context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) // 指定时长超时结束context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) // 手动结束context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) // 指定时间结束

2020-09-17 15:33:58 2084 1

转载 Go 在orm中使用反射

作为静态语言,golang 稍显笨拙,还好 go 的标准包reflect(反射)包弥补了这点不足,它提供了一系列强大的 API,能够根据执行过程中对象的类型来改变程序控制流。本文将通过设计并实现一个简易的 mysql orm 来学习它,要求读者了解mysql基本知识,并且跟我一样至少已经接触 golang 两到三个月。orm 这个概念相信同学们都非常熟悉,尤其是写过rails的同学,对active_record的强大肯定深有体会(得益于的method_missing和define_method方法,少写了

2020-09-14 21:49:15 684

转载 Go 语言中Select与for结合使用break

func test(){ i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5{ fmt.Println("break now") break } fmt.Println("i

2020-09-14 17:14:38 1635

转载 Go并发模型:合理退出并发协程

目录说明master:使用stop通道,主动告知goroutine退出stop_channel:和master相同detect_close_channel: 示例可以使用for-range替代for-select,range能检测通道关闭,自动退出detect_close_channel_v2:在前一个基础上,增加了监控功能,必须使用for-select,使用ok方法检测通道关闭,退出协程goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这

2020-09-14 14:40:01 759

转载 Go并发模型:流水线模型

Go作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,Go并发模型有多种模式,通过流水线模型系列文章,你会更好的使用Go的并发特性,提高的程序性能。这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。Golang的并发核心思路Golang并发核心思路是关注数据流动。数据流动的过程交给channel,数据处理的每个环节都交给goroutine,把这些流程画起来,有始有终形成一条线,那就能构成流水线模型。但

2020-09-14 14:31:55 915

转载 全面认识高并发

高并发,几乎是每个程序员都想拥有的经验。原因很简单:随着流量变大,会遇到各种各样的技术问题,比如接口响应超时、CPU load升高、GC频繁、死锁、大数据量存储等等,这些问题能推动我们在技术深度上不断精进。在过往的面试中,如果候选人做过高并发的项目,我通常会让对方谈谈对于高并发的理解,但是能系统性地回答好此问题的人并不多,大概分成这样几类:1、对数据化的指标没有概念:不清楚选择什么样的指标来衡量高并发系统?分不清并发量和QPS,甚至不知道自己系统的总用户量、活跃用户量,平峰和高峰时的QPS和TPS等关键

2020-09-14 12:04:26 790

转载 Go 依赖注入库dig

简介今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。快速使用第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装:$ go get go.uber.org/dig$ go get gopkg.in/ini.v1$ go get github.

2020-09-13 17:15:37 911

转载 Golang视角下的设计模式

这篇文章想聊聊Golang语言下的设计模式问题,我觉得这个话题还是比较有意思的。Golang没有像java那样对设计模式疯狂的迷恋,而是摆出了一份“看庭前花开花落,望天空云卷云舒”的姿态。单例模式:Gloang的单例模式该怎么写?随手写一个,不错,立马写出来了。但这个代码有什么问题呢?多个协程同时执行这段代码就会出现问题:instance可能会被赋值多次,这段代码是线程不安全的代码。那么如何保证在多线程下只执行一次呢?条件反射:加锁。。。加锁是可以解决问题。但不是最优的方案,因为如果有1W并发,每一个线

2020-09-09 21:19:49 193

转载 Elasticsearch理解

生活中的数据搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:结构化数据非结构化数据结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和咅频、视频信息等。说明:如果要更细致

2020-09-07 22:58:54 361

转载 Go context详解

什么是 contextGo 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。随着 context 包的引入,标准库中很多接口因此加上了 context 参数,例如 database/sql 包。context 几乎成为了并发控制和超时控制的标准做法。context.Context

2020-09-04 19:45:29 14930 6

原创 Golang test编译使用

创建文件my_test.gopackage testsimport "testing"func TestMy(t *testing.T) { t.Log("TestMy")}通常用法:$ go test -v -run TestMy my_test.go=== RUN TestMy TestMy: my_test.go:6: TestMy--- PASS: TestMy (0.00s)PASSok command-line-arguments 0.619s

2020-07-23 12:27:13 1950

转载 一个秒杀系统的设计思考

前言秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题。整体思考1 秒杀存在的问题对于一个日常平稳的业务系统,如果直接开通秒杀功能...

2020-04-27 23:22:15 927

转载 TCP 为什么三次握手

参考文章Why do we need a 3-way handshake? Why not just 2-way大部分网络博客的错误解读首先需要声明的是, 百度搜索到的大部分网络博客关于这个问题的解答都是不清晰或者不准确的。 讨论这个问题的大部分博客都会引用《计算机网络》的内容:防止已失效的连接请求又传送到服务器端,因而产生错误不幸的是, 这种解释是不准确的, TCP 采用三次握手的...

2020-04-23 11:31:30 315

转载 UDP如何实现可靠性传输

1 UDP与TCP的区别TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP是User Datagram Protocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。可靠性由上层应用实现,所以要实现udp可靠性传输,必须通过应用层来实现和控制。2 TCP如何实现可靠性传输?确认机制、...

2020-04-17 16:51:17 6906

转载 TCP和UDP的区别

TCP与UDPTCP与UDP基本区别基于连接与无连接TCP要求系统资源较多,UDP较少;UDP程序结构较简单流模式(TCP)与数据报模式(UDP);TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证UDP应用场景:面向数据报方式网络数据大多为短消息拥有大量Client对数据安全性无特殊要求网络负担非常重,但对响应速度要求高编程时的区别soc...

2020-04-17 16:27:05 257

转载 tcpdump常用命令

tcpdump 参数-c <number>: 指定抓包个数tcpdump -c 2tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on atcp_veth0, link-type EN10MB (Ethernet), capture size 65535 by...

2020-04-17 16:19:16 981

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除