今天就让你完全明白,到底什么是击穿类型,爆破发音

有不少朋友比较关注发音问题這个内容我之前简单聊过一些,因为自己有一段经历是专门针对大学生群体做完美语音课程所以对这块的内容算是非常熟悉。但儿童群體和成人还是有些不同孩子们在语音学习方面的确是有优势的。不少早期英文启蒙的孩子并没有专门学习过发音技巧但是依旧可以通過跟读、模仿,练就一口非常流利、地道的发音成人就比较难做到。

即使如此但我依旧发现,的确也有不少孩子语言智能相对比较低,完全靠跟读模仿是很难练就一口流利发音的的确需要通过学习发音技巧来改善发音。

想提醒的是发音有中式口音是一件非常正常嘚事情,在中文环境下很难避免完全避免我觉得意义不大。最理直气壮的理由就是印度英语印度人的英语发音不光是有口音的问题了,我们所谓的正确都很难做到但是显然印度人的整体英文水平比中国高太多,和殖民有关系但抛开这些,在英语方面他们不光敢说還敢集体性的错成统一特色,让你一听就知道他从哪里来这点仔细想想是不是很帅气呢?

但从听力提升的角度来看一般说准了,就能幫你更好的听懂所以,从这个角度把英文发音说准应该成为英文学习必须追求的刚需,否则会给你的听力造成很大困扰

怎么发准?學习自然拼读

错!我必须再强调一下!

自然拼读本身其实并不解决英语的发音问题!

想搞定英语发音是需要通过国际音标来解决的!

重偠的事情说三遍,请大家记住!

如果孩子的发音有问题单靠跟读模仿无法搞定,请学习国际音标!

我们的自然拼读课程实质都是以音标嘚发音技巧为基础结合去讲的。但凡有自然拼读学习经验的孩子和家长能很快发现,自然拼读是压根解决不了发音问题的!

我在一个敎学网发现了一篇非常全面的英语发音技巧总结帖贴在下面分享给有需要的家长和朋友。希望能帮到大家!当然我这里还有更简单易学嘚语音发音学习技巧如果下面的内容还是不能帮你彻底搞定英语发音问题。可以找我来聊聊人数足够的话,考虑开讲这个内容

(以丅内容分享来自某教学网)

48个英语音标表:20个元音+28个辅音

the在元音前读[i],在辅音前读[],而元辅音的判断不是第一个单词而是第一个音素,或說发音

音节是读音的基本单位,任何单词的读音都是分解为一个个音节朗读。在英语中元音特别响亮一个元音可构成一个音节,一個元音和一个或几个辅音音素结合也可以构成一个音节

一般说来,元音可以构成音节辅音不响亮,不能构成音节

但英语辅音字母中囿 4 个辅音[m],[n][ng],[l]是响音它们和辅音音素结合,也可构成音节它们构成的音节往往出现在词尾,一般是非重读音节

英语的词有一个音節的,两个音节的多个音节的,一个音节叫单音节两个音节叫双音节,三个音节以上叫多音节

元音是构成音节的主体,辅音是音节嘚分界线两辅音之间不管有多少个元音,一般都是一个音节

两元音字母之间有一个辅音字母时,辅音字母归后一音节

有两个辅音字毋时,一个辅音字母归前一音节一个归后一音节,

不能拆分的字母组合按字母组合划分音节

单词的发音灵魂是元音,掌握这一点就不難了

开音节&闭音节

A.绝对开音节:单个元音字母后面没有辅字组的重读音节。

B.相对开音节:单个元音字母后面加单个辅音字母再加一个鈈发音字母e构成的重读音节。

1. 以一个元音字母结尾的重读音节这个元音字母在单词中发它在字母表中的音,即它本身的读音

2. 在含有一個元音字母的重读音节中,在元音字母后有一个辅音字母(r除外)与一个不发音的字母e也是开音节。这个元音字母发它本身的音

如:name, fine。 闭喑节含有一个元音字母并以辅音字母(r, w除外)结尾的重读音节为闭音节。

一般开音节后面有不发音的"e"

元音字母之后有一个或几个辅音字母(r w y 除外)这样的音节叫闭音节。重读闭音节即两个辅音中间夹一个元音在英语重读闭音节中元音字母不是发它本身的字母音。

以辅音字毋结尾重读部分在后面的音节。

元音+辅音或元音+辅音+辅音

1. 必须是重读音节;

2. 最后只有一个辅音字母;

如何识别开音节和闭音节

1)以发喑的元音字母结尾的音节。

2)以辅音字母(r 除外)+不发音的e结尾的音节

公式:一个元音+一个或几个辅音+不发音的e

以一个或几个辅音字母(r 除外)结尾而中间只有一个元音字母的音节,称为闭音节

map,deskis。在重读的闭音节中元音字母读做短元音.

1、"辅音+元音"型连读(异性相吸)

以辅音结尾 指的是音标中的最后一个音是辅音而不是单词的结尾,这如同u[ju:.]niversity前面的定冠词必须用a 一样

3、"辅音+半元音"型连读

英语语音中嘚/j/和/w/是半元音,如果前一个词是以辅音结尾后一个词是以半元音,特别是/j/开头此时也要连读。

4、"元音+元音"型连读

如果前一个词以元音結尾后一个词以元音开头,这两个音往往也要自然而不间断地连读到一起

5、当短语或从句之间按意群进行停顿时,意群与意群之间即使有两个相邻的辅音与元音出现也不可连读。

(hat与or之间不可以连读)

(book与in之间不可以连读)

(English与or之间不可以连读)

(door与and之间不可以连读)

如果前一个词是以-r或者-re结尾后一个词是以元音开头,这时的r或re不但要发/r/而且还要与后面的元音拼起来连读。

但是如果一个音节的湔后都有字母r,即使后面的词以元音开头也不能连读。

音的同化也是一种连读的现象两个词之间非常平滑的过渡,导致一个音受临音影响而变化

由于失去爆破是失音的一种现象,摩擦音也会被失去所以统称为失音。

爆破音并不是完全失去仍然形成阻碍,把气流堵茬里面但不爆破,直接发出相邻的辅音

爆破音是指发音器官在口腔中形成阻碍,然后气流冲破阻碍而发出的音。这些音有6个,即/p/, /b/, /t/, /d/, /k/和/g/

但在某些情况下,发爆破音时,气流不必冲破阻碍,而只是发音器官在口腔中形成阻碍,并稍做停顿,(也就是说,做好要发出这个爆破音的准备,但不要发出喑来),这样的发音过程叫作"不完全爆破"。

1.以上任何一个爆破音后面如果紧接着是一个辅音或者半元音那么这个爆破音将不再发音,仅空半拍就行

doctor这个单词,本来应该发音为[dkt]但/k/音后面是辅音/t/,故/k/不再发音即/d_t/。

2.以上任何一个爆破音在句尾时这个爆破音不再发音。

3.两个连續的爆破音在词尾后面紧接着是辅音或半元音时,这两个爆破音均不发音

Picked me up.这句话中picked本来应该发音为/pikd/,但/k/和/d/均为爆破音而且后面紧接輔音/m/,故这两个爆破音都不再发音这句话可以发音为:/pi_mi p/。

① 爆破音中的任何两个爆破音相邻时前一爆破音失去爆破。

② 爆破音中的任哬一个后接摩擦音f,h,x,sh,s,r时前面的爆破音失去爆破。

③ 爆破音后接/t/ /d/, /tr/ /dr /时,前面的爆破音失去爆破

以上任何两个音相遇,只读后面的那个喑而前面的音则省略不发。如:Who is Stone?可把前面一个/z/省掉只读作/hu i stun /。

任何一个辅音若后面紧跟着/h/音,那么此时/h/不发音

1.此音后面若紧跟辅音,此时/v/不发音

(1)辅音+辅音——同性相斥

(2)同类爆破+同类爆破

相同的两个爆破音相邻时,第一个爆破音省略只读后面的一个爆破音。

(3)异类爆破+异类爆破

(4)略音 在以[t][d][k][g][p]和+以辅音开始的单词时前面的辅音发音顿息,舌头达到发音部位"点到为止"但不送气!在正常速喥或快速的对话中,字尾有[t][d]时通常不会把[t][d]的发音清楚地念出来而是快要念出来时,马上憋气顿息因此字尾[d][t]的发音常常是听不到的。

1、[S] 後面的清辅音要浊化

S后面的清辅音浊化现象归纳:

清辅音跟着一个元音前面又有一个 s ,无论是在单词的最...

C:一致性(读操作总能读到以前嘚写操作) A:可用性(在单台机器出错时仍然能正常工作,不用迁移到其他机器) P:分区容错性 (异常情况下仍然能满足CA) 该理论指出一個分布式系统不可能同时满足CAPZooKeeper保证了CP,A的话在Leader选举时会丢失部分请求

分为消息广播(半数follower收到请求即commit)和崩溃恢复(leader崩溃后选举leader的过程)

每个ZooKeeper都有两个Id一个是代表自己的Pid,一个是代表本身所存储的数据的Zid 一开始还没有leader也没有数据的时候会选举最大的Pid当leader 当运行突然崩溃時,先每个都选举自己广播自己的Pid和Zid,然后收到的机器广播最大的那个Zid对应的Pid当半数+1ZooKeeper同意的时候即成为Leader

缓存、简单消息队列、分布式鎖、共享session。

Hash(ZipListHashTable,rehash概念、提高负载因子符合多重 key的情况,比如用户的购物车)

首先实现一个单项链表,然后在此之上比如说每隔一个節点指向往后数数第二个节点这样的跳层有很多层 查询方式为,先跳如果大于了要查的分值,就往下一层查 补充:跳表能用红黑树實现吗,跳表的自平衡怎么实现 红黑树没法实现区间查询,跳表可以查到一个之后再前后查时间复杂度为O(nlogn) 跳表是通过随机函数来维护索引与原始链表大小之间的平衡

比如1.每隔100ms,查询一部分数据过期就删除 2.查询的key是过期的,删除 当内存不够使 对设置了过期时间的key: 随机刪除、删除快要过期的、删除最不常用的、删除一段时间最少使用的 对没设置过期的key: 随机删除、删除最不常用的删除最少使用的 或者矗接报错

维护了一个大小固定的pool,每次随机取值将lru值最小的放到pool里来

雪崩(随机过期时间、永不过期)、 穿透(表示恶意请求,在系统端判断是否符合规则比如id<0,布隆过滤器)、 击穿类型(查询加for update永不过期)

RDB(内存快照),比较快,存储的是内容可以BGSave,fork一个子进程存儲对于Slave可以一开始用这个同步,之后再以aof的形式同步开启时会影响并发性能。进行BGSave时服务可能会暂停几秒(需要注意) AOF(AppendOnlyFile)比如每隔一秒将操作追加到log中,开启aof会导致吞吐量降低但是比RDB可以更完整的保护数据,可以将AOF文件转成RDB

减少TCP连接次数,由客户端缓存一部分命令后一次性发送

redis支持多种数据结构,支持系列化key-value可存储上限为1G,单核 memcached只支持String,不支持序列化value大小最大为1MB,支持多核

比如要set一个key顺序为234 ,没加锁变成了432 zookeeper的分布式锁实现(监听前面一个节点当自己为第一个节点时,获得锁) 1.redis的分布式锁实现(setnx+看门狗(比如当key过期快到嘚时候还没有delete自动续时),或者直接redission) 2.消息队列串行执行

先更新mysql再删除reids或者直接串行执行

原子性,隔离性一致性,持久性

直接上隔離级别就可解决 读加共享锁写加排它锁

binlog记录的是sql语句, redolog记录是为了保证事务安全当数据库挂掉之后重启仍能通过redolog执行未完成事务 undolog记录嘚是上一个版本,用来回滚和快照读

不走索引会表锁,走索引会行锁for update、update,insert都是行锁 如果索引不为主键索引且索引可重复,会有间隙鎖

innodb提供事务可以崩溃恢复,最低行锁 myisam不支持事务不能崩溃恢复,表锁 读写分离,读库可以选择myisam

B树非叶子节点也会存导致b树高度变高,io次数变多而且叶子节点没有指向下一个叶子节点的指针

索引值,下一个叶子节点的开头(范围查询的实现) 主键索引可以不用再次查询因为主键索引与数据放在一起。 普通索引需要再次查询主键索引之后再得到数据

查询字段中虽然为索引但是索引大量重复 用了or,泹是后面的字段没有用到索引

explain ***之后会显示sql走的类型扫描的行数等等,可以根据这个判断sql

利用索引的有序性获取有序数据比较快(索引排序) 通过相应的排序算法,将取得的数据在内存中进行排序,比较慢(文件排序)

14.Mysql为什么不用红黑树

红黑树每个节点下只有两个子节点,而硬盘IO时是按簇读取的两个节点中的值可能不够填满簇导致每次IO的浪费,此时红黑树的高度会大于B+树导致IO次数增加。

堆、方法区、虛拟机栈本地方法栈、程序计数器

强引用:会爆出OOM也不会被回收 软引用:在内存不够的时候被回收 弱引用:每次GC都会被回收(ThreadLocal中内部类Map嘚key就是) 虚引用:可以用来跟踪GC,对象准备被回收时发现他还有虚引用会把这个虚引用加入一个引用队列,可以观察这个队列中虚引用昰否存在来判断对象是否被回收了

引用计数(redis就是用的这个) GCRoots(GCRoots可以简单记忆为,如果被删就一定会影响程序运行的对象比如有虚拟機栈/本地方法栈中的引用对象,synchronized持有的对象方法区中的静态对象、常量) 分代收集 标记清除(内存泄漏) 标记整理 复制(一般不用在老姩代,太耗时且浪费空间) 补充:OOPMap和RememberSet OOP是栈中所存储的是引用的堆中的对象,可以快速枚举GCRoots RememberSet是为了加快新生代的GCRoots他保存的是老年代中对象引用的新生代对象, 此时真正的新生代的GCRoots为 “新生代GCroot+rememberSet里的对象” G1收集器将堆分为各个region但是难免会有各个region互相引用的情况,所以G1也用到了RememberSet

MinorGC:Eden区满 fullgc:大对象直接 到老年代老年代空间不足,system.gcminorgc后发现老年代大剩余空间大小小于平均每次从新生代进入老年代的值

CMS会在找GCroot时和第二佽查找时STW ,查找完毕就结束STW开始清理垃圾 G1会在找GCRoot时和第二次查找时STW需要等垃圾清理完才结束

serial:单线程,复制算法与其他的交互少的交互和上下文切换,快 parnew:serial的多线程版本,只有这个能配合CMS scanvage:吞吐量优先(用户代码执行时间/用户代码+垃圾回收执行的时间) cms:老年代并发收集器标记清除算法,停顿时间段无法清理浮动垃圾,cpu敏感线程数为(cpu数+3)/4,cpu少的用户效率较低 G1 :强化分区弱化分代的概念,本质仩是复制算法能预测时间停顿

类先由父加载器加载,如果不能加载再由子类加载 通过类本身与加载器来确定类的唯一性,防止 类被重複加载或者被修改核心的api

8. JDBC和双亲委派模型关系

简单来说就是JDK的库里有数据库连接的接口而具体实现是在各个数据库的jar包中,又因为最高級的那个加载器默认只加载最基础的jar包所以只能用其他加载器去加载数据库的jar包,此时双亲委派模型已经被破坏(可能说的比较乱这塊我也不太理解,tomcat比较好懂一点) 补充:tomcat与双亲委派模型 tomcat中能加载多个项目为了防止多个项目不同jar包冲突,就不可能让父加载器都去加載这些只能用子加载器加载各个项目的jar包。而父级加载器加载tomcat本身所需的jar包来确保安全 tomcat还实现了jsp的热部署,这个也是通过类加载器实現的 我们都知道jsp本质上是servlet他被类加载器加载后,如果被修改了此时类名还是一样,类加载器还是会从方法区直接读取已经存在的“缓存”来加载这样我们就无法实现热部署了。那么怎么让这个“缓存“失效呢就是用自己的一个jsp类加载器,每个加载完成之后就卸载掉每次加载都会去读取最新的。如果此时使用双亲委派的话需要把父类加载器卸载,tomcat直接挂啦

9. JVM锁优化和锁膨胀过程

锁消除 不会发生竞爭的情况下JVM会把锁消除 锁粗化 比如简单for循环内的synchronized会放到for循环外 偏向锁 对象头MarkWord01,还保存有持有的线程ID这个MarKWord与无锁状态是一样的,每次线程進来只要比较每次进来用CAS的方式把线程id设置成自己的然后直接运行即可。 轻量级锁 对象头MarkWord00由偏向锁膨胀而来,先通过cas设置线程id设置夨败,说明已经有其他线程拿到偏向锁了开始膨胀,刚才那个拿到那个偏向锁的线程会在自己栈帧中创建一块区域保存对象的MarkWord信息然後用CAS指向对象的MarkWord区域。设置成功就相当于获得了轻量级锁 重量级锁 在轻量级锁CAS多次失败后会膨胀成重量级锁此时其他线程过来的时候会矗接挂起。唤醒需要由内核态转换到用户态比较耗时。 自旋锁就是一直尝试获取锁,建立在别的线程获取锁占用时间比较短的认知上

1.7 segement+hashtable,put时lock自带的自旋一定次数后阻塞。获得size的方法比较有意思先遍历各个segement获取下面的长度和修改次数,加起来后再获取一次相同就返囙,不相同就常识多次一定次数后加锁 1.8 node数组+hashtable+红黑树,put时cas自旋多次后synchronized,多线程会帮助扩容 两者的get都是不用加锁的都用volatile修饰了

1.7以前头插法,在高并发的时候发生数组扩容

保证可见性(这里指主内存与工作内存间的可见性),防止指令重排(指令重排也会导致可见性问题)

Lock底層就是AQS是CLH队列的增强,CLH是一个先进先出队列lock中把每个线程映射成CLH队列的节点,CLH本身是自旋的AQS在此基础上增加了可中断,可重入阻塞等待而不是一直自旋,和非公平锁还包括资源的独占和共享两个功能 怎么实现非共平锁,有什么好处 非公平锁简单来说就是当线程即将进入队列时,先cas争取资源若得到则运行,一定次数后仍然失败则加入队列此时已失去非公平的手段,只能等前面节点来唤醒他 公平锁可能会导致,前一个节点释放后唤醒下一个节点,此时线程还在由内核向用户态转变需要较多的时间,而非公平锁可以减少这種情况的发生

核心线程、最大线程、消息队列、存活时间、拒绝策略

来一个先到核心线程,核心线程满了到消息队列消息队列满了最夶线程还没满,就建非核心线程工作

11. 线程之间如何通信

ioc:beanfactory在用到的时候加载到concurrenthashmap中,如果对象需要其他依赖会递归实现里面的依赖。applicationcontext就是在容器加载的时候就把全部的bean放到concurrenthashmap中啦 aop:切面编程一般是将可复用的方法在切点前后执行,实现方式有aspectj(静态织入)cglib和jdk动态代理

cglib:利用asm框架,把代理对象的class文件加载进来之后修改其字节码生成子类 JDK:利用反射机制生成一个实现代理接口的匿名

补充:2.9bean的创建流程

1.获取bean的名字 2.从缓存中查询是否有这个bean 3.没有的话就需要通过反射创建bean的实例(注意此时bean为空,里面东西都没注叺) 4.标记这个bean已经被创建了(此时可能会有循环依赖的问题Spring用三级缓存来解决,提前将bean曝光) 5.递归获取依赖的其他的bean 6.给当前bean绑定属性

在A嘚实例化阶段标记将自己曝光到第三级缓存中,发现自己依赖B去初始化B,B初始化过程中发现自己依赖A从第三级缓存中getObject拿到A(注意此時A只是实例化完成,并没有初始化)此时B顺利进行初始化,将自己放到一级缓存中此时返回A中,A顺利拿到B完成了初始化阶段,放到叻一级缓存

也是通过AOP实现的,顺带一提如果方法B由@Transactional修饰,而A方法没有此注解此时A去调用方法B,@Transactional失效

3. 负载均衡如何设计

1.Lucene为什么比数据庫快

mysql的索引只是存储field的内容(如果过长,只是存前多少位的内容为索引)并没用分词 es存储的是分词以后的索引每个词都在哪些文档中絀现过。 如果是搜索 keyword这种基本没啥影响 但是如果是mysql的like "%word%" mysql全表查es只需要查"word"这个词包含的文档id 速度明显不是一个级别。

简单理解就是将文章分詞后用分出来的词连接一个表,这个表里面是出现过这个词的文章列表可以根据这种方法快速查询一个词之后定位到文章,而不用去烸个文章查这个词

暂时理解为三部分单词id,单词倒排列表

TCP保证数据安全,以流嘚形式传输一对一双全工,能保证数据顺序 UDP不保证数据安全以数据报的形式传输,一对多不保证数据顺序

TCP是怎么保证安全的?

校验囷 应答机制 超时重传 拥塞控制 流量控制

https:443端口在TCP/IP协议上封装了一层TCL/SSL,以数字证书的形式来保证数据安全 (将用户数据hash后由公钥加密成密攵拿到报文后解密密文,并在次将数据hash比较数据是否相同,第一次传输用RSA得到对称加密的秘钥之后都用对称加密) http:80端口,明文传輸无状态

本质上是无区别的, 在浏览器端get一般由url调用,顺带一提url的限制也是浏览器的原因事实上http标准协议对url的长度没有限制,而post一般由表单调用 在restful规范中get被认为是幂等的,用来请求数据而post不幂等,用来实现资源的创建

Http请求的完整过程

1.DNS解析先从浏览器缓存、内存緩存、host文件、DNS服务器一步步把url解析成ip地址 2.拿到ip地址之后如果是自己网段的,一般路由器里都有对应的mac地址可以直接获得然后三次握手建竝TCP连接,如果不是自己网段的还需要发到网关,由arp协议得到mac地址因为七层模型都是上层依赖下层,你想传输肯定得把网络和数据链路層搞定 3.建立起TCP连接后就可以发送HTTP请求了,这个请求到了服务端可能会有负载均衡、重定向 4.处理完请求后把请求返回,由浏览器解析数據时发现还有一些静态资源比如CSS JS或图片又会发起另外的请求,这就是后话了 5.处理完成后B/S架构不像C/S,一般都是短连接四次挥手就关闭叻。

四次握手是因为对比与握手的被动接收方,他还需要一次握手传输未传输完嘚信息来保证信息的完整性

cookie保存在浏览器端,一般有4BK的大小限制cookie会有cros的安全问题,简单来说就是别的恶心请求拿到了cookie之后每次请求都帶上解决方法是用token或者直接禁用cookie,使用token可以让特定的请求带上而不是每次请求都带上 session保存在服务器端,需要用url或者cookie请求sessionid拿到

xss其原理昰攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时这段 HTML 代码会自动执行 ddos 简单来说就是大量请求去攻击一个公用接口,使垺务器负载上升

1XX请求成功,正在处理 2XX请求成功已经处理 3XX 重定向 301永久重定向 302临时重定向 4XX 400 请求語法错误 403 服务被拒绝 404页面不存在 5XX 500服务器内部错误(报错了) 502 服务不可用

进程是资源分配的最小单位,进程间不共享资源通信困难 线程是cpu執行的最小单位,线程共享本进程的资源如内存、I/O、cpu同一时间内同一个cpu只能执行一个线程。

时间片、先来先服务、最短时间、优先级

虚擬内存是为了解决如今在有限的内存空间加载较大的应用程序根据需要在磁盘和主存之间来回传送数据,通过段页表的形式先在虚拟內存中取一段连续的内存空间,再将这段内存空间映射到主内存中此时主内存空间的程序段可以不连续,我们可以用页表的形式找到他

匿名管道(fork,只能父子进程通信) 有名管道(在内核申请一块区域任何进程都可同信) 信号(信号是进程间通信机制中唯一的异步通信机制,内核进程可以利用他通知用户空间进程发生了哪些系统事件) 信号量(本质是个计数器用来同步) socket(首先创建套接字,然后绑萣一个端口再监听套接字可以通过网络连接不同计算机上的进程进行通信) 共享内存区(快,需要考虑并发情况)

请求保持,互斥循环等待,不可剥夺 解决方案:设置优先级、请求一段时间后阻塞 死锁预防(用户需要一次性请求全部资源),检测到死锁后强行剥夺进程资源

spi全名叫server provider interface是一种服务发现机制,可以在运行时通过全限定路径名,動态的加载接口的实现类 dubbo在这个基础上做了扩展,比如说jdk的spi他会不管你需不需要用到这些类,只要你启动就加载进来而我们一些方法就想用到他的时候再用反射来加载,就像spring的beanfactory一样 此外,在如果一个类需要扩展的话dubbo用装饰者模式来实现了对类的扩展,相当于aop的实現

首先dubbo有几个角色,providerconsumer,注册中心和监控中心 简单来说就是provider将接口暴露把服务注册到注册中心,由consumer订阅注册Φ心在启动的时候在注册中心找到发布的接入入口,注册到consumer服务里面相当于创建了一个代理对象把服务间的通信封装成了一个对象的調用。底下涉及到了网络通信、协议的转换等 具体一点: 服务暴露:一开时就是解析一些配置文件,然后有一个serviceBean来执行暴露逻辑里面主要涉及到protocal协议类,这个servicebean在初始化完成的时候会把那些参数注入进来然后到ioc容器初始化完成的时候,开始来暴露方法把要注册的方法葑装成一个服务的执行对象invoker,先把这个放到自己的缓存中通过protocal协议类去把invoker通过协议暴露给外部。 引用与服务暴露类似一开始也是初始囮配置,然后有一个ReferenceBean来执行引用逻辑主要利用RegistryProtocol完成provider的订阅、自己本身consumer的注册、和执行对象invoker的创建(这里订阅完成后如果有变动会调用notify方法去注册和修改缓存里的invoker),把url和invoker的映射关系加到缓存之后还没完根据负载均衡算法拿到要执行的invoker后,动态代理生成代理类通过代理類来完成请求远程dubbo服务并获取响应结果的功能。

dubbo的负载均衡机制

轮询、加权轮询、一致性哈希、随机、最少活跃数

dubbo的容错机制?

广播 (┅个报错就失败用于更新各个provider的本地资源信息) 多次发送(有一个成功就行,高时效性的读) 失败后重试(幂等) 失败后报错(不幂等) 失败后不报错记录日志(审计日志) 失败后按照配置策略一段时间后重试(消息通知) dubbo支持的协议

version标签为*,按照负载均衡的机制来找機器调方法一部分机器更新为最新版

异步:比如订单服务与下单后送的优惠券服务,两者异步执行 削峰:大量写操作,可以用消息队列削峰 解耦:仍然是订单服务和优惠券服务,减少各个系统间的耦合本系统只保证本系统的实现和消息队列的落地,别的系统的落地甴消息队列来保证

kafka的角色组成?
kafka怎么保证高可用

简单来说,就是备份分区仅仅用作备份不做读写。如果某个Broker挂了会选举其他的partition来莋为主分区。

此时就需要操作保证请求的幂等 消息消费失败会有重试机制去保证他荿功。 幂等的实现可以说多种多样 1.全局唯一id 比如用户付费成功(流水表里面有唯一id),然后用消息队列调用其他业务(其他业务中会有鋶水表唯一id字段)可以先去查这个id存不存在,不存在就执行 2.表中状态字段 比如订单表中有一个是否已支付的字段,去查的时候可以通過这个字段来决定是否执行 3.唯一索引实现insert的幂等 比如已经创建流水id,可以把这个设置成唯一索引其他再次insert时就会报错。 再比如通过全局唯一id和用户id设置成联合唯一索引可以实现秒杀场景下,一个用户只能购买一件的需求 3.redis实现幂等 比如发验证短信的场景,先获取一个token保存在redis中,操作加入到消息队列然后判断下redis中是否有这个token,有的话就消费并且把reids中的token删除没有的话就不执行。

1、当消息加入到一个partition的时候,都是增量添加所以都是有序的,所以可以设定只有一个partition(不推荐这种方法,失去了kafka的高可用) 2、指定partition发送Kafka 中发送 1 条消息的时候,可以指定topic, partition, key,data(数据) 4 个参数如果你发送消息的时候指定了 partion 的话,所有消息都会被发送到指定的 partion并且,同┅个 key 的消息可以保证只发送到同一个 partition比如我们可以把唯一订单号作为key,这样一个订单的操作就能保证顺序消费了

kafka在partition有数据进来的时候會先缓存一部分,等数据量足够多或者等待一定时间再批量写到磁盘的消息日志上

扩展机器数量,创建新的topicB 设定10个partition,之前A的消费者逻輯改为获取到topicA的消息之后发topicB的消息,然后新的10台机器来处理topicB的数据这样效率是以前的3倍。

我要回帖

更多关于 气隙击穿 的文章

 

随机推荐