TCP粘包/拆包TCP是个流协议,所谓流,就是没有界限的一串数据。大家可以想想河流里的流水,它们是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP的拆包和粘包问题。
TCP粘包和拆包发生的原因问题产生的原因主要有三个,分别如下:
应用程序write写入的字节大小大于套接字发送缓冲区大小
进行MSS大小的TCP分段
以太网帧payload大于MTU进行IP分片
粘包问题的解决策略由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用层协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下:
消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
在包尾增加回车换行符进行分割,例如FTP协议;
将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个 ...
简介: [Sentinel](https://github.com/alibaba/Sentinel) 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,最近正式开源。Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。大家可能会问:Sentinel 和之前常用的熔断降级库 Netflix Hystrix 有什么异同呢?本文将从多
Sentinel 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,最近正式开源。Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。大家可能会问:Sentinel 和之前常用的熔断降级库 Netflix Hystrix 有什么异同呢?本文将从多个角度对 Sentinel 和 Hystrix 进行对比,帮助大家进行技术选型。
Overview先来看一下 Hystrix 的官方介绍:
Hystrix is a library that helps you control the interactions be ...
系统架构
未读订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想的情况。去年大量抢购活动的开展,使数据库达到瓶颈,应用只能通过限速、异步队列等对其进行保护;业务需求层出不穷,原有的订单模型很难满足业务需求,但是基于原订单表的DDL又非常吃力,无法达到业务要求。随着这些问题越来越突出,订单数据库的切分就愈发急迫了。
这次切分,我们的目标是未来十年内不需要担心订单容量的问题。
先对订单库进行垂直切分,将原有的订单库分为基础订单库、订单流程库等,本文就不展开讲了。
垂直切分
垂直切分缓解了原来单集群的压力,但是在抢购时依然捉襟见肘。原有的订单模型已经无法满足业务需求,于是我们设计了一套新的统一订单模型,为同时满足C端用户、B端商户、客服、运营等的需求,我们分别通过用户ID和商户ID进行切分,并通过PUMA(我们内部开发的MySQL binlog实时解析服务)同步到一个运营库。
水平切分
切分策略1. 查询切分将ID和库的Mapping关系记录在一个单独的库中。
查询切分
优点:ID和库的Mapping算法可以随意更改。缺点:引入额外的单点。
2. 范围切分比如 ...
我就是很多人里的那个嘴里说着不要二胎,却生了二胎的人。
之前我们同事说,很想生老二,我很决绝的说了我肯定不生,养不起养不起。后来疫情,我悄么声的怀了老二,等回到工作岗位,就有6个月了。我同事说,你这咋怀了,当时不是不要老二吗,反而我这说要生老二的,后来说服了自己,决定只生一个。
其实,不管你信不信,有些事情不能说的特别死,就像你说我从来不感冒,没想到过了几天感冒了一样。生活就是这么戏剧,活活把自己演成了小丑。
之前我确实是不想也不敢生二胎。观念转变是因为,看到老大,这个有着你遗传基因的小人儿,一点点长成了让你惊喜的样子。就很好奇,如果再有一个和自己有着血缘关系的男孩子(老大女孩),会是什么样,参与孩子成长的过程总是让人屡试不爽。
再者,老大那会也特别想要一个哥哥或姐姐。我说那是不能够了,生也只能是你的弟弟或妹妹。试想,一个不到4岁的孩子,会缠着你说,妈妈,咱们聊了天吧,聊聊生个孩子。我问她,为什么想要妈妈生个孩子。尽管这样问,其实我知道她回答不上来,毕竟才3岁多。于是我就引导着问她,是不是班里的小朋友都有兄弟姐妹(中途给她解释了一下什么叫做兄弟姐妹)啊?她说嗯,你看方方圆圆(她们班里的 ...
对象结构在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。下图是普通对象实例与数组对象实例的数据结构:
1 对象头HotSpot虚拟机的对象头包括两部分信息:
markword 第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度****在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为“MarkWord”。
klass 对象头的另外一部分是klass类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例. 32位4字节,64位开启指针压缩或最大堆内存<32g时 4字节,否则8字节
数组长度(只有数组对象有) 4字节如果对象是一个数组, 那在对象头中还必须有一块数据用于记录数组长度.int最大值2g,2^31,java数组(包含字符串)最长2g
2 实例数据实例数据部分是对象真正存储的有 ...
说明移动场景下DNS解析开销是整个网络请求中不可忽略的一部分。在弱网环境下,基于UDP的LocalDNS解析非常容易出现解析超时的问题,并且即使解析成功会消耗数百毫秒乃至更甚,对我们整个业务请求而言是非常不利的,它直接影响了客户的体验。
对于一个比较大众的应用而言,DNS的优化对整个应用的网络优化所占的权重是很大的。我们接下来从以下几个方面全面理解DNS,相信对我们开发中的网络优化会有不小的帮助。
DNS
认识DNS
DNS解析相关概念
DNS域名层次结构
权威DNS
递归DNS
公共DNS
转发DNS
域名解析记录方式
域名解析过程
全局负载均衡GSLB
智能DNS
DNS解析存在的问题
DNS劫持
DNS解析域名时缓存解析结果
转发解析
HTTPDNS
什么是HTTPDNS
HTTPDNS的特性
如何支持HTTPS
问题
主机是如何知道DNS服务器地的IP地址的?
为什么DNS采用UDP协议 ?
1. DNS1.1 认识DNSDNS(Domain Name System)是域名“系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于T ...
前言我们在上一章节中介绍过数据库的带你了解数据库中事务的ACID特性 的相关用法。本章节主要来介绍下数据库中一个非常重要的知识点事务的隔离级别。如有错误还请大家及时指出~
问题:
事务的隔离级别有哪些?
如果并发事务没有进行隔离,会出现什么问题?
以下都是采用mysql数据库
在多个事务并发做数据库操作的时候,如果没有有效的避免机制,就会出现种种问题。大体上有以下问题:
一、引发的问题在并发事务没有进行隔离的情况下,会发生如下问题。
问题一:脏读脏读指一个事务读取了另外一个事务未提交的数据。
具体看后文案例介绍
问题二:不可重复读不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。 不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
具体看后文案例介绍
问题三:幻读(虚读)幻读(虚读)指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
具体看后文案例介绍
二、概念2.1 事务的隔离级别分为:
Read uncommitted(读未提交)
Read Committed(读已提交)
Repeatable ...
所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size.这是两个在平时不太常见的名词,本文会对这两个名词做一个详细的解释。
Shallow Size对象自身占用的内存大小,不包括它引用的对象。针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。针对数组类型的对象,它的大小是数组元素对象的大小总和。
Retained SizeRetained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。
看图理解Retained Size上图中,GC Roots直接引用了A和B两个对象。
A对象的Retained ...
你得先知道在介绍双亲委派机制的时候,不得不提ClassLoader(类加载器)。说ClassLoader之前,我们得先了解下Java的基本知识。 Java是运行在Java的虚拟机(JVM)中的,但是它是如何运行在JVM中了呢?我们在IDE中编写的Java源代码被编译器编译成**.class**的字节码文件。然后由我们得ClassLoader负责将这些class文件给加载到JVM中去执行。 JVM中提供了三层的ClassLoader:
Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
AppClassLoader:主要负责加载应用程序的主函数类
那如果有一个我们写的Hello.java编译成的Hello.class文件,它是如何被加载到JVM中的呢?别着急,请继续往下看。
双亲委派机制我打开了我的AndroidStudio,搜索了下“ClassLoade ...
我那会就是想着足月就能生出来,每次B超胎儿也总是比实际孕周大两周,盼望着盼望着终于到了B超测的孕37周,双顶径9.1,估重3620左右,胎儿偏大,也做好了随时待产的准备。
就产检的各种指标,在我看来是怎么不会等到预产期的,再加上据其他人的经验,男孩容易提前出来。但是事与愿违,37周没有出来,后来盼到实际孕周的37周,还是没有发动。自我安慰说,只要躲过处女座,哪天出来都可以,但是心里还是希望能早一天卸货就早一天,也担心胎儿过大,到时候顺转剖,简直受罪。往后的日子真是数着过,觉得即漫长又短促。
就这样熬到了38周,尽管天天坚持1万多步的遛弯,最多的时候能走2万1千多步。熬过了39周,除了遛弯,我看做蹲起也有利于孩子早日发动,就这样遛弯配合蹲起。最终,过了预产期,还稳稳不动,我就有点坐不住了,2天就往医院跑一次,希望医生把我留下,可是医生说,你这各项指标都正常,我没有办法给你开住院单子,你就回去吧,只要疼了就来,如果没有发动,就下周再来,满41周我就给你开住院了。在40周+6的时候,半夜十二点半羊水破了,我知道这是要生了,立马赶往医院。预产期10月12号,到17号才出来,不仅熬过了处女座, ...