消息传输推与拉的比较
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息传输推与拉的比较相关的知识,希望对你有一定的参考价值。
参考技术A 在服务器与客户端进行信息传输的时候,是客户端从服务器拉去消息,还是服务器往客户端推送消息,这是在设计一个需要网络通讯系统需要考虑的问题。本文将介绍推与拉这两种交互方式的优缺点,和一些案例经典的框架是如何选择推和拉的形式的。
推和拉都有各自的优缺点,先说推、拉的实现。推一般情况下是服务端与客户端维护了长连接,服务端使用这个长连接进行的消息推送。而拉则是客户端采用轮询的方式定期查看服务端是否有消息变更,如果有就拉去下来。
这就是简单的推和拉的实现,他们的优缺点也比较明显。推的优势在于实时性很高,当服务端发送信息变更之后由服务端主动推送这样的实时性是非常高的。而缺点在于消息都是由服务端主动推送,当服务端很频繁的推送消息的时候,由于客户端的处理速度是不同的,由服务端去推送消息目的是为了让信息及时发送给客户端提高客户端的消费速率,但是当客户端的处理速度低于服务端的推送速度,客户端往往会不堪重负。
而拉的优点在于,由客户端按照自身的处理情况按照一定的周期去服务器拉去信息,这样就不会出现服务端压死客户端的情况。但是拉的形式有一个问题是你拉去的周期是多少?周期太长,服务端与客户端的消息延迟最坏情况就是一个周期,周期太短,当服务端没有信息的时候会导致长期的空轮训。基于这个问题我们可以采用长轮询去解决,客户端会一直阻塞直到服务端有数据才返回。
上面介绍了推和拉的实现和各自的优缺点,这里将列举一些经典框架,看它们是如何选择的,这样也会加深对推和拉的认识。
kafak作为消息队列,采用的是生产者往broker推消息,消费者往broker拉消息。为什么消费者采用的是拉的形式?上面分析过,如果采用推的形式,各个消费者的消费速率是不同的很可能将客户端压垮。而且采用推在消息系统中还有另外一个不好的点,因为kafak为了提高吞吐量,消息都是批量发送和批量消费,当服务端不知道下游的消费速率的时候,将系统调整为低延迟状态,这就会导致一次只发送一条消息,以至于传输的数据不再被缓冲,这种方式是极度浪费的。 因为 消费者 总是将所有可用的(或者达到配置的最大长度)消息 pull 到 log 当前位置的后面,从而使得数据能够得到最佳的处理而不会引入不必要的延迟。
apollo作为配置中心,当我们更改了配置之后,服务端能够及时的将变动通知给客户端,apollo采用的就是拉的形式,下面是apollo客户端获取变更的步骤:
不同于传统的pull,apollo采用的是 long pull,简单来说传统的pull当服务端没有消息的时候会立即返回,而long pull在服务端没有变动的时候会将请求挂起,直到有数据或者请求超时才返回请求。这有点类似于jdk中的阻塞队列 BlockingQueue 调用poll方法会一直阻塞当前线程直到有数据返回,只不过这个是跨进程的。
配置中心对于变更的实时性要求不是很高,所以apollo采用了拉的形式,而且为了避免客户端的空轮训采用长轮询的方式。
zookeeper作为分布式协调框架,提供丰富的功能,其中一个就是watcher机制。Watcher是zookeeper中很重要的功能。客户端通过对znode创建watcher当节点发生变化的时候(节点删除、数据更改、子节点变化等),ZooKeeper将会通知注册Watcher的客户端节点已经变更。
zookeeper实现watcher采用的是推和拉结合的方式,节点的变化是需要实时通知的所以采用推的模式,但是zookeeper这里推送的信息只是节点的变化事情,告诉客户端这个节点发生了变动,而非推送这次变动的信息。具体的变动信息是客户端按照自己的需要去从服务端拉去变动的信息。采用这样方式每次变动只需要传输少量数据,减少变动通知的IO传输。
经过分析了kafka、apollo、zookeeper三个案例之后,发现推和拉并没有什么绝对的使用场景,还是需要在自己特定的创建选择合适的方法,必要时候两个也可以同时存在,适合自己才是最好的。
现代信号处理 05 - 递推与线性预测
递推与线性预测 Recursive Linear Prediction
1. 线性预测引入
线性预测是要解决这样的问题。假设我们有n个随机变量,事实上,如果我们把随机变量的角标看做是时间,这就是一个随机过程,否则的话,就是一组随机变量
Z 1 , Z 2 , . . . Z n , Z n + 1 Z_1,Z_2,...Z_n,Z_{n+1} Z1,Z2,...Zn,Zn+1
现在我们希望能够利用前面的n个变量,通过线性的方法,去估计第n+1个变量,这就是线性预测问题
Z
=
(
Z
1
,
Z
2
,
.
.
.
Z
n
)
T
=
>
Z
n
+
1
Z=(Z_1,Z_2,...Z_n)^T => Z_{n+1}
Z=(Z1,Z2,...Zn)T=>Zn+1
事实上,研究随机过程,很大程度上就是为了进行线性预测。
我们定义一个参数α
α
=
(
α
1
,
.
.
.
,
α
n
)
T
\\alpha = (\\alpha_1,...,\\alpha_n)^T
α=(α1,...,αn)T
我们通过对Z进行线性组合来估计Zn+1
α T Z = ∑ k = 1 n α k Z n + 1 − k → Z n + 1 \\alpha^TZ = \\sum_{k=1}^n \\alpha_k Z_{n+1-k} \\rightarrow Z_{n+1} αTZ=k=1∑nαkZn+1−k→Zn+1
我们的优化条件这样的
m i n E ( Z n + 1 − ∑ k = 1 n α k Z n + 1 − k ) 2 minE(Z_{n+1}-\\sum_{k=1}^n \\alpha_k Z_{n+1-k})^2 minE(Zn+1−k=1∑nαkZn+1−k)2
注意这里只是将Zk的角标进行了倒转,不影响问题的本质
我们之前学过了正交性原理,这里的最优估计,就等价于所有的原材料与残差之间都是正交的
m i n E ( Z n + 1 − ∑ k = 1 n α k Z n + 1 − k ) 2 = > E ( Z n + 1 − k ∗ ( Z n + 1 − ∑ k = 1 n α k Z n + 1 − k ) ) = 0 k = 1 , 2 , . . . , n minE(Z_{n+1}-\\sum_{k=1}^n \\alpha_k Z_{n+1-k})^2 \\\\ =>E(Z_{n+1-k}*(Z_{n+1}-\\sum_{k=1}^n \\alpha_k Z_{n+1-k})) = 0 \\\\ k = 1,2,...,n minE(Zn+1−k=1∑nαkZn+1−k)2=>E(Zn+1−k∗(Zn+1−k=1∑nαkZn+1−k))=0k=1,2,...,n
因此,我们就有
= > E ( Z n + 1 − k ∗ Z n + 1 ) − ∑ i = 1 n α i E ( Z n + 1 − i ∗ Z n + 1 − k ) = 0 =>E(Z_{n+1-k}*Z_{n+1})-\\sum_{i=1}^n \\alpha_i E(Z_{n+1-i}*Z_{n+1-k}) = 0 =>E(Zn+1−k∗Zn+1)−i=1∑nαiE(Zn+1−i∗Zn+1−k)=0
这里我们假设Z是个平稳过程,因此Z的自相关就仅仅与下标的差(时间差)有关系
= > R Z ( − k ) − ∑ i = 1 n α i R Z ( − i + k ) = 0 => R_Z(-k)- \\sum_{i=1}^n \\alpha_i R_Z(-i+k) =0 =>RZ(−k)−i=1∑nαiRZ(−i+k)=0
因为相关函数是对称的
R Z ( − k ) = R Z ( k ) R_Z(-k) = R_Z(k) RZ(−k)=RZ(k)
所以有
R
Z
(
k
)
−
∑
i
=
1
n
α
i
R
Z
(
k
−
i
)
=
0
(
k
=
1
,
.
.
.
,
n
)
R_Z(k)- \\sum_{i=1}^n \\alpha_i R_Z(k-i) =0 \\quad (k=1,...,n)
RZ(k)−i=1∑nαiRZ(k−i)=0(k=1,...,n)
这个方程就Wiener-Hopf方程
我们来表示一下这个方程
(
R
(
0
)
R
(
1
)
.
.
.
R
(
n
−
1
)
以上是关于消息传输推与拉的比较的主要内容,如果未能解决你的问题,请参考以下文章