- 博客(24)
- 收藏
- 关注
原创 为什么IM要使用websocket协议
前言:目前在做的IM项目中,接入层有http短连接层及websocket长连接层,http主要用于好友、通讯录、群管理等业务,而websocket层承载了我们最核心的业务,如即时要求最高的消息发送、音视频信令业务。所以今天跟大家来聊一聊websocket。1、早期实现:很多网站为了实现推送技术,所用的技术都是轮询。轮询是指由浏览器每隔一段时间向服务器发出HTTP请求,然后服务器返回最新的数据给客户端。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求与回复可能会包含较长
2021-04-24 13:37:27
1287
原创 go中int和byte转换
go转换demo//整形转换成字节func IntToBytes(val int64) ([]byte, error) { bytesBuffer := bytes.NewBuffer([]byte{}) if err := binary.Write(bytesBuffer, binary.BigEndian, val); err != nil { return nil, err } return bytesBuffer.Bytes(), nil}//字节转换成整形func Byte
2021-04-20 14:24:11
1259
原创 如何快速开发IM系统:点对点消息设计
一、IM系统的特点:1、实时性:保证消息实时到达是互动场景的必须能力;2、可靠性:“不丢消息”和“消息不重复”是系统的前置条件;3、一致性:“多用户”“多终端”的一致性体验能大幅提升 IM 系统的使用体验;4、安全性:“数据传输安全”、“数据存储安全”、“消息内容安全”三大方面提供隐私保护;二、点对点在线消息发送流程:1.APP1向接入层发送信息;2.接入层将消息转发给业务层;3.业务层将消息存储到DB;4.业务层向接入层发送ack;5.接入层将ack转发给APP1;6.业务层检索r
2021-04-05 18:04:29
854
原创 mysql批量插入提示repared statement contains too many placeholders
一、问题:使用gorm框架批量插入通讯录信息出错:Prepared statement contains too many placeholders。二、分析:超过mysql占位符导致,mysql默认占位符大小:m*n<65535,m是行数,n是列数。参考:https://dev.mysql.com/doc/mysql-errors/5.6/en/server-error-reference.html三、解决:分割为每1000个插入一次:for i := 0; i < len(a
2021-03-27 13:29:01
6207
1
原创 golang截取相应字节数和字符数
一、golang截取相应字节数和字符数(go中一个汉字字符占3个字节数)截取30个字节:if len(userName) > 30 { userName = userName[:30]}截取30个字符:if len([]rune(userName)) > 30 { userName = string([]rune(userName)[:30])}...
2021-03-18 11:46:23
1689
原创 golang转换时间格式报missing Location in call to Date
一、问题golang使用"Asia/Shanghai"时区转换时间格式报:missing Location in call to Date二、解决sendTime := "2021-03-12 10:00:00"loc, err := time.LoadLocation("Asia/Shanghai") //设置时区if err != nil { loc = time.FixedZone("CST", 8*3600)}tt, _ := time.ParseInLocation("2006-0
2021-03-17 11:47:47
2376
原创 mysql并发删除事务导致等锁超时问题
一、现象:使用gorm框架对mysql并发删除事务导致:Lock wait timeout exceeded;try restarting transaction问题。二、分析:1、查看mysql事务等级:show variables like ‘%isolation’;2、查看删除的key的索引:mul(普通联合索引)分析:数据库数据做了分库分表规则,索引未使用唯一联合索引导致等锁超时。三、解决:暂时去除删除事务,这个出现可能性太低,但对性能影响较大。改用其他方式解决。如扔到问题队列异步重
2021-03-12 13:54:02
1352
原创 go服务RSS占用高,但实际使用内存低的问题
一、问题现象1、使用golang1.15版本编译的服务,线上环境性能压测完RSS一直占用3个多G,压测结束内存一直未下降;2、用pprof查看inuse_space内存,占用才两百多兆;二、问题定位性能压测完再次压测内存并未继续增加,排除内存泄漏问题,怀疑是go内存管理方式导致。最终发现是go1.15版本内存管理方式(using MADV_FREE)的原因。参考:https://golang.org/doc/go1.16#runtime:On Linux, the runtime now defa
2021-03-01 10:39:43
3745
1
原创 go-redis使用管道一次传输多条语句
一、介绍项目中碰到需要一次插入、删除多个key的情况,数据结构用的是hash存储,可以使用redis的pipeline功能实现。注:Redis的pipeline功能的原理是 Client通过一次性将多条redis命令发往Redis Server,减少了每条命令分别传输的IO开销。同时减少了系统调用的次数,因此提升了整体的吞吐能力。二、使用pipeline添加 pipeline := redisdb.Pipeline() pipeline.HMSet(ctx, "key1", "friendType
2021-02-18 16:56:41
2062
原创 gorm连接mysql支持apm上报
import ( "gorm.io/gorm" apmgorm "go.elastic.co/apm/module/apmgormv2/driver/mysql")func main() { db, err := gorm.Open(apmgorm("dsn"), &gorm.Config{}) ... db = db.WithContext(ctx) db.Find(...) // creates a "SELECT FROM <foo>" span}上报的话默
2021-01-15 18:32:19
379
原创 gorm框架存在插入,存在则更新处理
一、gorm库github地址:https://github.com/go-gorm/gorm使用说明:https://gorm.io/docs/二、探索gorm支持clause来实现Upsert的功能,但是发现只支持根据id进行判断,如果对应id记录存在则更新,对应id记录不存在则插入。如下:dbtable.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, DoUpdates: clause.Assign
2020-12-18 11:03:14
26156
11
原创 mac上实现proto转go文件
一、安装protoc1、访问https://github.com/protocolbuffers/protobuf/releases,下载cpp版本,我这边下载的是protobuf-cpp-3.14.0.tar.gz;2、解压后进入目录,运行./autogen.sh;3、如果提示./autogen.sh: line 37: autoreconf: command not found,需安装automake:brew install automake4、再次运行./autogen.sh;5、编译
2020-11-26 18:03:17
1404
转载 一个海量在线用户即时通讯系统(IM)的完整设计Plus
《一个海量在线用户即时通讯系统(IM)的完整设计》(以下称《完整设计》)这篇文章发出来之后有不少读者咨询问题,提出意见或建议。主要集中在模块拆分、协议、存储等方面。针对这些问题做个简单说明。1、真实生产系统的模块拆分比《完整设计》一文中要复杂许多。《完整设计》只在反应IM系统最核心大功能点之间的关系,便于没有经验的读者能够快速上手进行IM设计和开发。真实运行系统的架构接近于这张图2、消息存储部分,最初版本采用的MySQL,之后改成了HBase(用Cassandra也行)。按照会话进行了分区,单聊、群聊是分.
2020-11-18 16:53:55
988
原创 golang常用pprof命令随笔
一、Godoc文档浏览器访问1、直接cmd命令行下,运行godoc -http=8080;2、然后浏览器输入127.0.0.1:8080访问本地的godoc文档库二、常用pprof调试命令指令:1、go tool pprof 127.0.0.1:6061/debug/pprof/profilecpu查看cpu信息;2、go tool pprof 127.0.0.1:6061/debug/pprof/heap查看内存信息;类型说明:-inuse space:分析应用程序的常驻内存占用情况;
2020-11-14 10:52:36
1290
翻译 golang线程调度模型详解
常用线程调度模型1、N:1,其中几个用户空间线程在一个OS线程上运行。这样做的优点是可以非常快速地进行上下文切换,但不能利用多核系统的优势。2、1:1,即一个执行线程与一个OS线程匹配。它利用了机器上的所有内核,但是上下文切换很慢,因为它必须通过操作系统进行捕获。3、M:N,也是Go目前使用的。它将任意数量的goroutines调度到任意数量的OS线程上。您可以快速切换上下文,并利用系统中的所有核心。这种方法的主要缺点是它增加了调度器的复杂性。Golang线程调度模型详解为了完成调度任务,Go调度
2020-10-11 11:32:01
1035
原创 使用dlv分析golang进程cpu占用高问题
c++通过dbg分析内存和cpu,可能大家都会。本篇主要分析通过delve分析golang程序cpu占用高的问题。delve是golang推荐的专门go语言调试工具,用来替代gdb。golang组织说delve能更好的理解go语言。先用vscode写个简单的demo,main.go代码如下:package mainimport ( "fmt" "os" "os/signal")func main() { fmt.Println("main start") msgList := m
2020-05-17 17:29:02
3070
原创 golang协程优雅退出
使用sync包中的Waitgroup结构,官方文档对它的描述:A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs ...
2020-05-05 17:16:49
810
原创 VMware里CentOS7安装docker
1、安装相关工具类#安装sudo yum install -y yum-utils device-mapper-persistent-data lvm2123#提示错误:Another app is currently holding the yum lock; waiting for it to exit...#解决ps -aux|grep yum查看相关进程并且kill,如果没有用...
2020-05-05 14:36:08
828
原创 golang中json.marshal字符转义问题
最近在封装自定义json库,数据结构用自带的map,序列化接口调用了json.marshal去实现,发现&字符序列化之后变成了\u0026。1、查阅了godoc文档,解释如下:String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode repl...
2019-11-04 20:59:08
4545
2
原创 rabbitMQ操作参数(一):生产者和消费者参数
大家日常工作中可能会用到rabbitMQ,基于AMQP协议的中间件。最近在重写服务,刚好在封装rabbitMQ的基础操作库,现将生产者和消费者会涉及的参数记录下,一来怕自己时间久了会忘记做下备注,二来也给大家做个参考。publish(生产者)参数:1、mandatory:当mandatory设置为true时,如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue...
2019-10-21 22:13:04
1393
原创 教你一次搞定商汤的电话面试
哈哈,有点标题党了,其实最后我是被拒了,内心一万点暴击。其实我的表现还可以,不知道为啥还是被拒了。在此分享下心得,给你们参考哈。一面:1、简单介绍下当前项目?因为本身我目前主要负责的就是架构及重构的相关工作,对项目架构其实非常了解。2、stl verctor和list的区别,哪个是内存连续的?这个非常简单,一个数组,一个双向链表,内存连续的肯定是verctor了,扩容方案再说下即可。上次我去...
2019-10-19 23:37:20
1581
原创 linux日志排查常用命令
一、vi命令1、单行删除:dd或者ESC然后冒号后输入1 d2、批量删除:N dd或者ESC然后冒号后输入1,10 dd3、搜索命令:/ pattern:从光标开始处向文件尾搜索pattern?pattern:从光标开始处向文件首搜索pattern4、翻屏命令:Ctrl + f:向文件尾翻一屏Ctrl+b;向文件首翻一屏二、grep命令1、grep foo file --col...
2019-10-07 21:52:20
565
转载 gdb调试分析多线程死锁
gdb调试分析多线程死锁 #include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <unistd.h>static int sequence1 = 0;static int sequence2 = 0;pthread_mutex_t loc...
2019-09-27 17:16:41
577
原创 常用网络IO模型
一、5大网络IO模型简介网络编程是服务器高并发编程的基础,是服务端开发的同学必然要掌握的一项重要技能。例如我们平时工作做会用到libevent等开源网络库,libevent是典型的reactor模式。又比如常见的分布式缓存redis,也实现了基于epoll的reactor模式网络通信,当然redis还实现了基于select、kqueue、IOCP等其他的网络通信模式。下面我们简单介绍下常见的网络...
2019-09-12 19:51:19
292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅