程序架构
文章平均质量分 90
无痕幽雨
宠辱不惊,看庭前花开花落!
去留无意,望天上云卷云舒!
展开
-
群消息已读回执,究竟是推还是拉?
每当发出一条微信消息,都希望对方尽快看到,并尽快回复,但始终不知道对方是否阅读。每当收到一条不能立马回复的微信消息,都默默返回,假装没看见。画外音:不想回复的人,唉,你只是个好人。微信用于个人社交,产品设计上,在线状态,强制已读回执都有可能暴露个人隐私,故微信并无相关功能。钉钉用于商务交流,其“强制已读回执”功能,让职场人无法再“假装不在线”,“假装没收到”。有甚者,钉钉的群有“强制已读回执”功能,你在群里发出的消息,能够知道谁读了消息,谁没有读消息。群...转载 2021-02-01 10:45:41 · 1283 阅读 · 0 评论 -
【解惑】到底是“时间片“?还是“分时轮询“?
1、任务调度任务调度对于电子类或者自动化类专业小伙伴最早接触一般都是在接触RTOS后了,然而对于计算机相关专业的小伙伴应该在学《计算机操作系统》老师对这一块讲解的非常清楚了,包括一些性能指标的定义与计算等等,不过作者这里仅仅只针对RTOS进行讲解,大家感兴趣可以找一下操作系统的书籍更加深入学习。大家都知道我们的操作系统可以隐蔽底层实现,为用户提供API接口来供我们的应用程序服务,同时操作系统可以管理多个任务实现CPU的最大利用率,然而对于RTOS提供的最主要功能就是任务的调度来管理多...转载 2020-07-02 09:03:48 · 1337 阅读 · 1 评论 -
“ID串行化”是如何保证消息顺序性的?
在《消息顺序性为何这么难?》中,介绍了一种为了保证“所有群友展示的群消息时序都是一致的”所使用的“ID串行化”的方法:让同一个群gid的所有消息落在同一台服务器上处理。ID串行化是如何实现的呢?互联网高可用常见分层架构客户端,反向代理层,接入层,服务层,存储层,这是互联网常见的高可用分层架构。画外音:这个图用过好多次。这里的“服务层”至关重要,ID串行化保...转载 2020-01-17 12:24:21 · 238 阅读 · 0 评论 -
网页端收消息,究竟是推还是拉?
出处:网页端收消息,究竟是推还是拉?任何脱离业务的架构设计都是耍流氓。网页端收消息,究竟是推还是拉? 需求缘起对于在网页端登录的用户A,发送方,也就是消息的来源有几方面:系统发给A的“系统通知”,可能对实时性要求没这么高用户发给A的“聊天消息”,有对实时性要求比较高,越实时越好 消息的处理方,也就是系统侧,一般来说:有服务对消息进行逻辑处理有数据库对数据进行落地有缓存对数据进行加速抛开这些技术细节...转载 2018-07-06 09:17:24 · 250 阅读 · 0 评论 -
MVC框架
出处:https://baike.baidu.com/item/MVC%E6%A1%86%E6%9E%B6/9241230?fr=aladdinMVC框架 编辑MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和...转载 2018-07-02 09:39:02 · 424 阅读 · 0 评论 -
互联网分层架构的本质
出处:互联网分层架构的本质上图是一个典型的互联网分层架构:客户端层:典型调用方是browser或者APP站点应用层:实现核心业务逻辑,从下游获取数据,对上游返回html或者json数据-缓存层:加速访问存储数据-数据库层:固化数据存储 如果实施了服务化,这个分层架构图可能是这样:中间多了一个服务层。 同一个层次的内部,例如端上的APP,以及web-server,也都有进行MVC分层:view层:展...转载 2018-06-14 08:23:21 · 247 阅读 · 0 评论 -
状态同步,究竟是推还是拉?
出处:状态同步,究竟是推还是拉?任何脱离业务的架构设计都是耍流氓。 状态同步,有好友状态的同步,有群友状态的同步,有的需要实时同步,有的能够容忍延时。结合具体场景来看下,状态同步,究竟是推还是拉。用户的在线状态,分为客户端状态(端),服务端状态(云)两种形态。 什么是服务端状态?服务端状态,主要分为在线online和离线offline,不同的状态,对于不同的业务处理流程可能不同。例如对于消息的处理...转载 2018-06-11 11:45:00 · 878 阅读 · 0 评论 -
feed留,单聊群聊,系统通知,状态同步,到底是推还是拉?
feed留,单聊群聊,系统通知,状态同步,到底是推还是拉?今天抛一个话题,根据业务现象,一起讨论其后端实现是推还是拉?一、feed流可以理解为一个发布订阅业务,典型业务是微博(朋友圈)。你关注了姚晨的微博,姚晨发布了消息,你的主页能看到她最新发布的消息,这个场景是推送,还是拉取呢?画外音:微博是弱关系,关注无需对方同意,粉丝可以无上限;朋友圈是强关系,好友需要对方同意,好友个数有上线。如果推送,姚...转载 2018-05-22 08:57:24 · 434 阅读 · 0 评论 -
系统通知,居然有人使用拉取?
系统通知,居然有人使用拉取?任何脱离业务场景的架构设计都是耍流氓。 广义系统通知,有1对1的通知,以及一对多的通知,有相对实时的业务通知,以及能够容忍一定延时的系统通知。结合具体的场景来看下,这样的一些系统通知,究竟是推还是拉? 一、系统对1的通知典型业务,计数类通知:有10个美女添加了你为好友有8个好友私信了你很多业务经常有这类计数通知,通知结果只针对你,这类通知是推送,还是拉取的呢?常见的有这...转载 2018-05-22 08:56:23 · 306 阅读 · 0 评论 -
互联网分层架构,为啥要前后端分离?
出处:http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651960501&idx=1&sn=a452bab31c0457063241df237f955332&chksm=bd2d01698a5a887f9dfa5c6966d9e71bf492a040ab2dbe4e469ef38dd8ee5ab00b7c5...转载 2018-04-29 20:43:43 · 315 阅读 · 0 评论 -
互联网动静分离架构
互联网动静分离架构一、静态页面静态页面,是指互联网架构中,几乎不变的页面(或者变化频率很低),例如:首页等html页面js/css等样式文件jpg/apk等资源文件静态页面,有与之匹配的技术架构来加速,例如:CDNnginxsquid/varnish二、动态页面动态页面,是指互联网架构中,不同用户不同场景访问,都不一样的页面,例如:百度搜索结果页淘宝商品列表页速运个人订单中心页这些页面,不同用户,...转载 2018-05-18 09:21:23 · 305 阅读 · 0 评论 -
微服务 dubbospring 架构
出处:http://www.3xmq.com/article/1519714575377前言 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影响力的开源微服务架构框架提供了微服务的关键思路,例如 Dubbo 和 Spring Cl...转载 2018-03-21 17:22:03 · 427 阅读 · 0 评论 -
http的长连接和短连接
出处:http的长连接和短连接1.以前的误解很久之前就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接。但终究觉得对于长连接一直懵懵懂懂的,有种抓不到关键点的感觉。今天通过一番研究,终于明白了这其中的奥秘。而之前,也看过长连接相关的内容,但一直都是云里雾里的。这次之所以能在这么短的时间里搞清楚,和自己技术的沉淀密不可分。因此,这里借着这个机...转载 2018-07-06 09:52:17 · 376 阅读 · 0 评论 -
为什么分布式一定要有消息队列?
出处:为什么分布式一定要有消息队列? 为什么分布式一定要有消息队列?孤独烟 架构师小秘圈 5月31日作者:孤独烟来自:cnblogs.com/rjzheng/p/8994962.html 0 为什么写这篇文章?博主有两位朋友分别是小A和小B:小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就是和运营聊聊天,...转载 2018-07-24 15:17:21 · 871 阅读 · 0 评论 -
染色法求解“微信群覆盖”
出处:染色法求解“微信群覆盖”微信有很多群,现进行如下抽象:(1) 每个微信群由一个唯一的gid标识;(2) 微信群内每个用户由一个唯一的uid标识;(3) 一个用户可以加入多个群;(4) 群可以抽象成一个由不重复uid组成的集合,例如:g1{u1, u2, u3}g2{u1, u4, u5}可以看到,用户u1加入了g1与g2两个群。画外音,注意:gi...转载 2019-08-06 08:50:59 · 325 阅读 · 0 评论 -
协议解析随想
最近在做一个项目,其中用到了多路通信协议,做下总结吧,一边以后自己查阅。最常见就是一个通信通道,比如:UART,SPI,本地以太网等。一个数据流通道,一种解析模块。这种结构最简单了,开辟一个接收缓存,然后check解析即可,没啥可说的。如果是N个通道,一种解析协议,我们怎么做?先考虑简单的情况,就是解析发送,没有ACK等机制,驱动层各自收各自的,然后解析层可重入(即用临时变量传入...原创 2019-07-08 18:05:52 · 451 阅读 · 0 评论 -
缓冲池(buffer pool),这次彻底懂了!!!
应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。今天,和大家聊一聊InnoDB的缓冲池。Inno...转载 2019-06-23 07:50:47 · 24197 阅读 · 12 评论 -
消息顺序性为何这么难?
出处:消息顺序性为何这么难?很多业务都需要考虑消息投递的顺序性: 单聊消息投递,保证发送方发送顺序与接收方展现顺序一致 群聊消息投递,保证所有接收方展现顺序一致 充值支付消息,保证同一个用户发起的请求在服务端执行序列一致 消息顺序性是分布式系统架构设计中非常难的问题,有什么常见优化实践呢?折衷一:以客户端或者服务端的时序为准不管什么情况,都需要一个标...转载 2019-03-21 09:02:56 · 375 阅读 · 0 评论 -
10w定时任务,如何高效触发超时
出处:10w定时任务,如何高效触发超时 一、缘起很多时候,业务有定时任务或者定时超时的需求,当任务量很大时,可能需要维护大量的timer,或者进行低效的扫描。 例如:58到家APP实时消息通道系统,对每个用户会维护一个APP到服务器的TCP连接,用来实时收发消息,对这个TCP连接,有这样一个需求:“如果连续30s没有请求包(例如登录,消息,keepalive包),服务端就要将这...转载 2019-02-14 08:48:10 · 319 阅读 · 0 评论 -
模块的封装(五):状态机模板
出处:状态机模板 说在前面的话 好久没有整理代码了,最近一直在做ARMv8-M系统安全设计相关的研究,虽然忙,但不代表我对自己无聊的爱好——整理一些好玩的代码模板,或者说语法糖——失去了兴趣。人总是会变的,一段时间过去以后,发现过去写的代码真心看着“心累”——宏一律大写看着辣眼睛,比如以前写的状态机脚本,所有做“状态机脚本语法辅助”的宏都是大写,看着果然还是不舒服。这...转载 2018-08-03 13:32:27 · 1560 阅读 · 0 评论 -
群聊比单聊,为什么复杂这么多?
出处:群聊比单聊,为什么复杂这么多? 群聊是多人社交的基本诉求,一个群友在群内发了一条消息,期望做到:(1)在线的群友能第一时间收到消息;(2)离线的群友能在登陆后收到消息;群消息的实时性、可达性、离线消息的复杂度,要远高于单对单消息。 常见的群消息流程如何?群业务的核心数据结构有两个。 群成员表:t_group_users(group_id, user...转载 2019-01-23 08:59:33 · 860 阅读 · 5 评论 -
模块的封装(三):无伤大雅的形式主义
在前面的讨论中,我们介绍了如何在必要的情况下,利用结构体和联合体在C语言中引入应用所必须的一些面向对象的特性,例如,封装、继承、派生以及覆盖。从功能性上来说,前两章的内容就足够满足应用了;但从形式上来说,模块封装(二)中提供的类的继承方式在使用的时候还有那么一点不爽,所以,作为弥补一小部分有代码洁癖人的心头缺憾,今天我们就来讨论一种在不增加任何实质性系统开销的前提下实现对象成员访问的形式上的...转载 2016-11-10 10:37:21 · 535 阅读 · 0 评论 -
模块的封装
以前我转载过,现在找不到了,从新开篇博客吧。我们一直在写代码,大部分人都是从底层往上学(只有一些极少数的幸运儿能够有幸从上往下学习),因此我们没有机会站在工程的角度或者说产品的角度来看待我们的代码。通俗的说,就是我们只对自己的一亩三分地熟悉,而没有全局观。没有全局观,不能站在工程的角度看待问题,也就无所谓封装了。这篇文章就是封装的入门知识,让我们从另外一个高度来看待问题,思考问题。希望能够帮助大家...原创 2018-09-06 09:30:40 · 3153 阅读 · 0 评论 -
浅谈代码分层:构建模块化程序
出处:http://www.cppblog.com/kevinlynx/archive/2011/04/05/143430.html浅谈代码分层:构建模块化程序Author:Kevin LynxDate:4.4.2011Contact:kevinlynx at gmail dot com模块化的程序是怎样的程序?我们可以说一个具有明显物理结构的软件是模块化的,例如带 插件的软件,一个完整的软件由若...转载 2018-03-16 13:05:57 · 1172 阅读 · 0 评论 -
关于实时推送系统的那点事
出处:http://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=401006254&idx=1&sn=d69a0efc740e04ddefe3cdca14d56eb0&mpshare=1&scene=1&srcid=0302M9o0GjqZL27d4bRUBB1X#rd 于小波,系统架构师,2011年加...转载 2018-03-02 08:40:53 · 6342 阅读 · 0 评论 -
访问硬件的设计模式
出自《C嵌入式编程设计模式》这本是,算是给自己做的学习笔记吧。一、硬件的代理模式先来看看书上的定义:书上介绍的很详细了,我的理解就是硬件的代理模式就是基于接口的编程,程序依赖于接口,而不是依赖于具体的实现。当我们的硬件平台改变时候,只需要根据接口定义,再把底层驱动全部重写,而上层的逻辑的代码完全不需要改变,也就是接口屏蔽了硬件的具体实现细节。二、硬件适配器模式这个设计也很好理解,当我们把硬件驱动已...原创 2018-02-22 17:36:44 · 945 阅读 · 0 评论 -
谈谈你接触的通讯程序的模型
出处:http://bbs.chinaunix.net/thread-1840615-1-1.html这篇博客是从一个帖子整理而来,很不错,记录下,以备将来之需。 应用程序也做了不少了,特别是在通讯这块做了好几年,好几个项目,来来回回,思想和选择经过了好几番转变,经常会想起一些技术上的选择问题,不知道该如何取舍,今晚屋子比较安静,整理下思绪,发起这个话题,顺便听听大家的看法转载 2018-01-15 09:38:54 · 828 阅读 · 0 评论 -
面向对象三大特性五大原则 + 低耦合高内聚
出处:http://blog.csdn.net/m15712884682/article/details/52993085面向对象三大特性五大原则 + 低耦合高内聚面向对象的三大特性是"封装、"多态"、"继承",五大原则是"单一职责原则"、"开放封闭原则"、"里氏替换原则"、"依赖倒置原则"、"接口分离原则"。什么是面向对象面向对象(Object Orien转载 2018-01-23 09:27:08 · 406 阅读 · 0 评论 -
模块的封装(四):头文件的疼
出处:https://www.amobbs.com/thread-5675247-1-1.html[交流][微知识]模块的封装(四):头文件的疼 认真说起来,头文件(Header File)是个短命的家伙——就整个编译过程来说,它的寿命是最短的。为什么这么说呢?关于头文件的话题,讨论起来那可是“孩子没娘,说来话长了”,既然是闲聊、你也不是等着这篇文章救命,那就不妨从头开始说起...转载 2018-02-09 09:37:49 · 946 阅读 · 0 评论 -
架构设计:生产者/消费者模式[4]:双缓冲区
架构设计:生产者/消费者模式[4]:双缓冲区文章目录★为啥要双缓冲区?★双缓冲区的原理★双缓冲区的几种状态★可能的并发问题★应用场景 “双缓冲区”是一个应用很广的手法。该手法用得最多的地方想必是屏幕绘制相关的领域(主要是为了减少屏幕闪烁)。另外,在设备驱动和工控方面,双缓冲也经常被使用。不过今天要聊的,并不是针对上述的某个具体领域,而是侧重于并发方面的同步/互斥开销。另外提醒一下,双缓...转载 2018-02-09 09:32:23 · 666 阅读 · 0 评论 -
架构设计:生产者/消费者模式[3]:环形缓冲区
架构设计:生产者/消费者模式[3]:环形缓冲区文章目录★环形缓冲区 vs 队列缓冲区★环形缓冲区的实现★应用场合 前一个帖子提及了队列缓冲区可能存在的性能问题及解决方法:环形缓冲区。今天就专门来描述一下这个话题。 为了防止有人给咱扣上“过度设计”的大帽子,事先声明一下:只有当存储空间的分配/释放非常【频繁】并且确实产生了【明显】的影响,你才应该考虑环形缓冲区的使用。否则的话,还是...转载 2018-02-09 09:31:00 · 847 阅读 · 0 评论 -
架构设计:生产者/消费者模式[2]:队列缓冲区
架构设计:生产者/消费者模式[2]:队列缓冲区文章目录★线程方式★进程方式 经过前面两个帖子的铺垫,今天终于开始聊一些具体的编程技术了。由于不同的缓冲区类型、不同的并发场景对于具体的技术实现有较大的影响。为了深入浅出、便于大伙儿理解,咱们先来介绍最传统、最常见的方式。也就是单个生产者对应单个消费者,当中用【队列】(FIFO)作缓冲。 关于并发的场景,在之前的帖子“进程还线程?是一个...转载 2018-02-09 09:30:27 · 706 阅读 · 0 评论 -
架构设计:生产者/消费者模式[1]:如何确定数据单元?
架构设计:生产者/消费者模式[1]:如何确定数据单元?文章目录★啥是数据单元?★数据单元的特性 既然前一个帖子已经搞过扫盲了,那接下来应该开始聊一些具体的编程技术问题了。不过在进入具体的技术细节之前,咱们先要搞明白一个问题:如何确定数据单元?只有把数据单元分析清楚,后面的技术设计才好搞。★啥是数据单元? 何谓数据单元捏?简单地说,每次生产者放到缓冲区的,就是一个数据单元;每次消费者从缓冲区取出...转载 2018-02-09 09:29:42 · 223 阅读 · 0 评论 -
架构设计:生产者/消费者模式[0]:概述
架构设计:生产者/消费者模式[0]:概述文章目录★简介★优点★本系列的目录 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场。鉴于该模式很重要且相关内容比较丰富,俺打算分几个帖子逐一介绍。今天先来扫盲一把。如果你对这个模式已经比较了解,请跳过本帖子,直接看下一个帖子(关于如何确定数据单元)。 看到这里,可能有同学心中犯嘀咕了:在四人帮(Gang Of F...转载 2018-02-09 09:29:03 · 217 阅读 · 0 评论 -
架构设计:进程还是线程?是一个问题!
架构设计:进程还是线程?是一个问题!文章目录★进程【颗粒度】问题★“以业务逻辑为单元”划分进程的好处★进程间通讯(以下简称 IPC)问题★为啥还要线程? 就像莎士比亚的“To be, or not to be, that is the question”始终困扰着哈姆雷特,对于“进程还是线程?”这个问题,也经常困扰着那些进行软件架构设计的家伙。所以今天打算聊一下我对这个问题的体会。假如...转载 2018-02-09 09:28:14 · 236 阅读 · 0 评论 -
23种设计模式总结
出处:https://www.cnblogs.com/tongkey/p/7170826.html1.单例模式(Singleton Pattern)定义:Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)通用代码:(是...转载 2018-02-12 14:16:26 · 187 阅读 · 0 评论 -
调度器学习笔记二:软件架构模式
出处:http://colobu.com/2015/04/08/software-architecture-patterns/软件架构模式本文是我在阅读O'Reilly免费的电子书 Software Architecture Patterns过程中做的笔记。首先这本书非常新,2015年3月30号订正后发布。其次将目前流行的几种架构详细进行了剖析和比较转载 2016-12-06 09:24:02 · 2188 阅读 · 0 评论 -
层次状态机
出处:http://xlambda.com/blog/2014/11/04/hierarchical-state-machine/计算机程序是写给人看的,只是顺便能运行。—— 《计算机程序的构造和解释》 [1]FSM在计算机领域,FSM(有限状态机)是一个在自动机理论和程序设计实践中很常见的术语,简单来说,有限状态机表示的是系统根不同输入/不转载 2016-11-30 14:48:22 · 15910 阅读 · 1 评论 -
基于.NET平台的分层架构实战(五)——接口的设计与实现
出处:http://www.cnblogs.com/leoo2sk/archive/2008/06/18/1224764.html基于.NET平台的分层架构实战(五)——接口的设计与实现2008-06-18 19:50 by T2噬菌体, 11669 阅读, 41 评论, 收藏, 编辑接下来,将进行接口的设计。这里包括数据访问层接口和业务逻辑层接口。在分层架构中转载 2016-11-11 11:53:46 · 1067 阅读 · 0 评论 -
基于.NET平台的分层架构实战(四)——实体类的设计与实现
出处:http://www.cnblogs.com/leoo2sk/archive/2008/06/18/1224699.html基于.NET平台的分层架构实战(四)——实体类的设计与实现2008-06-18 15:15 by T2噬菌体, 13037 阅读, 47 评论, 收藏, 编辑实体类是现实实体在计算机中的表示。它贯穿于整个架构,负担着在各层次及转载 2016-11-11 11:52:23 · 412 阅读 · 0 评论