IM后端系统设计总结(2)

这篇具体写一下用户在线状态系统的具体设计。 后端架构 这个后端系统设计如下图: 很大众,国内基本都这么干,不多说 用户状态系统设计 初期设计 单IDC部署,设计如下: 相关说明 AG:接入网关,负责用户的连接 ConnRouter:连接路由服务器,主要提供以下功能: 所有用户状态的维护 用户状态查询 用户状态推送 用户状态同步 异步消息路由与转发 状态通知流: 用户登录成功或者下线状态通知 状态同步流:ConnRouter服务器之间用户状态的同步,不需要推送给订阅者 用户消息流: 异步发送给用户的消息在服务器内部的传输 设计要点 参考Kafka的模型,将用户状态改变作为事件,将事件描述为消息,将消息队列化成消息队列 AG对应Kafka中的Producer角色,主要原因是用户状态是用户连接的影子,AG能真实快速感知用户状态 ConnRouter对应Kafka中的Broker UserStat(用户统计与分析)与StateNotify(用户状态通知)对应Kafka中的Consumer 减少耦合,以异步发送消息到用户为例,整个流程三步走: 第一步:生成发送消息,发送到ConnRouter 第二步:根据目的用户ID,查找到出口AG,将消息转发到出口AG 第三步:出口AG查找用户连接,通过连接发送到目的用户 ConnRouter设计 用户状态数据存储设计 用户状态数据存储设计,如下图所示: ...

August 5, 2016

IM后端系统设计总结(1)

定义IM 为用户提供即时消息服务,这里面有三个关键词:用户,消息,服务;下面根据三个关键词来展开总结,先从消息开始。 消息 消息分类 对消息分类,很简单但是重要,方便后面业务的拆分。 ...

July 29, 2016

Go channel 特点篇

channel模式 根据同步方式不同,channel有两种模式: 1、同步模式,形式如下: 1 ch := make(chan int) 2、队列模式,形式如下: 1 ch := make(chan int, 10) 根据数据方向流不同,channel类型可以有以下三种模式: ...

July 26, 2016

知识 = 概念 + 连接

定义 在计算机编程领域有一个对代码的定义: 代码 = 数据结构 + 算法。 参考这个定义,对知识进行一个定义如下: 知识 = 概念 + 连接 概念 概念对就英文单词是concept。在维基百科中,concept的定义是: ...

June 28, 2016

如何开始行动

背景 人们常说: 万事开头难。 好的开始是成功的一半。 开始是基础。 “Starting is the first step towards achieving anything. Don’t wait for the perfect moment; make this moment perfect by taking action.” “The secret of getting ahead is getting started. The secret of getting started is breaking your complex overwhelming tasks into small manageable tasks, and starting on the first one.” — Mark Twain ...

June 13, 2016

10 Lessons from 10 Years of Amazon Web Services(译文)

前言 亚马逊在2006年3月14日发布AWS,到现在差不多10年了。回首过去的10年里,我们在构建 安全,高可用性,可扩展性,低成本的服务方面积累了几百条经验与教训。 由于AWS是建设并在全球运营这些服务的先驱,这些教训对我们的业务至关重要。正如我们以前多次说,“没有压缩经验的算法”,每月有超过百万的活跃客户,这些客户服务几个亿的用户,在这个过程我们不乏机会积累经验并持续优化从而为客户提供更好的服务。 ...

June 2, 2016

Facebook live一些技术细节

协议选择 最初选择HLS,后面切换为RTMP,切换为RTMP主要为了降低延迟,提供更好直播用户体验。 解决并发问题 分发架构 采用Live stream server, origin server, edge server 三层架构;如下图如示: ![分发架构图](/images/facebook live arch.png) 一句话就是:通过遍布各地的CDN节点(edge server)实现海量用户的播放请求。 ...

May 27, 2016

pdf tips

利用pdf的print来实现压缩pdf文件的大小 在个人的实践中可以做到将一个2.44M的pdf文件压缩到0.14M adobe是最好用的pdf工具,可以结合开源的pdf工具一起使用

May 25, 2016

git常用命令总结

配置 config user 1 2 git config --global user.email "you@example.com" git config --global user.name "Your Name" Ignore Git permission changes 1 git config core.fileMode false Fix .gitignore 1 git rm -r --cached . git仓库 初始化一个版本仓库 1 git init clone远程版本库 1 git clone git@github.com:myself659/FFmpeg.git 添加远程版本库origin 1 git remote add origin git@github.com:myself659/rtmpserver_demo.git 查看远程仓库信息 1 git remote -v 删除远程仓库 1 git remote rm <repository> git修改 添加当前修改的文件到暂存区 1 git add . 提交修改到本地 1 git commit -m "fix bug 0001" 提交修改到远程 1 git push -u origin master 查看修改状态 1 git status 重命名文件 1 git mv README readme 从版本库中删除文件 1 git rm readme 取消对文件修改 1 git checkout -- readme 修改最新一次修改注释 1 git commit amend 显示所有提交 1 git show 1 git show <commit> --stat 1 git show <commit> -- <filepath> 恢复最后一次提交的状态 1 git revert HEAD 恢复某次提交的状态 1 git revert <$id> Remove untracked files & directories 1 2 3 4 # To remove untracked files git clean -f # TO remove untracked directories git clean -fd Discard local changes 1 git reset --hard Delete untracked files 1 git clean -fd git commit Edit last commit in both local and remote repository 1 2 3 4 5 6 7 8 9 # Step 1: Check recent commit history git show HEAD # Step 2: Update commit locally git add <file-path(s)> git commit --amend -m "<New-commit-message>" # Step 3: Check recent commit history to verify the correct edit git show HEAD # Step 4: Push the edit upstream git push -f # Then, verify it in the web interface of the hosting service Delete last commit in both local and remote repository 1 2 3 4 5 6 7 # Step 1: Check recent commit history to check git log --oneline -5 # Step 2: Delete commit locally and push the change to remote git reset --soft HEAD~1 # Delete commit locally git push -f # Delete commit upstream # Step 3: Check recent commit history to check git log --oneline -5 git repository rename repository 1 2 3 4 5 6 7 8 9 10 # Step 1: Rename local repository cd .. # Go to the directory that holds the repository mv <repo-old-name> <repo-new-name> cd <repo-new-name> # Step 2: Check remote url git remote -v # Step 3: Update remote url git remote set-url origin <new-url> # Step 4: Check remote url for verification git remote -v git log 查看修改log 1 git log 查看指定文件每次提交记录 1 git log <filename> 查看最近两次详细修改内容的diff 1 git log -p -2 查看提交统计信息 1 git log --stat Move a commit from one branch to another 1 git cherry-pick COMMIT-HASH 查看项目各个成员提交代码统计 1 git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done git log graph 1 git log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%an%C(reset)%C(bold yellow)%d%C(reset) %C(dim white)- %s%C(reset)' --all git分支 查看远程分支 1 git branch -r 创建新分支 1 git branch <new_branch> 1 git checkout -b NEW-BRANCH-NAME 查看各分支创建最后提交信息 1 git branch -v 删除指定分支 1 2 git branch -d <branch_name> git push origin -d <branch-name> 强制删除指定分支 1 git branch -D <branch_name> 查看已经被合并到当前分支的分支 1 git branch --merged 查看尚未被合并到当前分支的分支 1 git branch --no-merged 合并分支 1 git merge <merge_branch> 切换分支 1 git checkout <branch_name> -f 抓取远程仓库所有分支更新并合并到本地 1 git pull 抓取远程仓库所有分支更新并合并到本地,不要快进合并 1 git pull --no-ff 抓取远程仓库更新 1 git fetch origin push所有分支 1 git push 将本地主分支推到远程主分支 1 git push origin master 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库) 1 git push -u origin master 创建远程分支 1 git push origin <local_branch>:<remote_branch> 查看所有分支名称 1 git branch --all check branch status 1 git status rename local branch 1 git branch -m OLD-BRANCH-NAME NEW-BRANCH-NAME rename remote branch 1 git push origin :OLD-BRANCH-NAME NEW-BRANCH-NAME Delete a branch on a remote repository 1 git push REMOTE-NAME --delete BRANCH-NAME clean git branches exclude main and master 1 git branch | grep -v "master" | grep -v "main" | grep -v ^\* | xargs git branch -D; Create a local copy of the existing remote branch 1 2 git fetch origin git switch --track origin/<branch-name> git diff 比较当前文件和暂存区文件差异 1 git diff <file> 比较两次提交之间的差异 1 git diff <$id1> <$id2> 比较两个分支 1 git diff <branch1> <branch2> 比较统计信息 1 git diff --stat 提交git diff How to Include Diff into Git Commit Message ...

May 21, 2016

Linux内核常见crash原因

前言 与前同事交流,发现以前的技术经历与解决的问题,现在接触不多,但是想想还是很有意思,虽然很多细节现在已经不能表达出来或展示出来,但是还得写出来。下面写的得主要个人经历的linux内核crash原因。 ...

April 17, 2016