Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

长连接双写问题是什么? #1887

Closed
Liubey opened this issue Jan 17, 2019 · 4 comments
Closed

长连接双写问题是什么? #1887

Liubey opened this issue Jan 17, 2019 · 4 comments

Comments

@Liubey
Copy link

Liubey commented Jan 17, 2019

这篇文章的末尾有写到:
1.为什么不用 TCP 长连接?对网络环境要求高,容易推送失败。且有双写问题。
2.为什么使用 HTTP 长轮询?性能足够,结合 Servlet3 的异步特性,能够维持万级连接(一个客户端只有一个长连接)。直接使用 Servlet 的 HTTP 协议,比单独用 TCP 连接方便。HTTP 请求/响应模式,保证了不会出现双写的情况。最主要还是简单,性能暂时不是瓶颈。

里面写到的双写,没琢磨出来

@nobodyiam
Copy link
Member

如果在短时间内配置变化了两次,且采用了通知变化时传输配置的形式,那两次通知的配置一个新一个旧。

抵达客户端后由于线程切换的关系,无法保证一定先update旧的配置,再update新的配置,所以可能会导致配置不正确。

所以apollo没有采用这种方式,而是只推送通知,由客户端从服务端拉取最新配置,这种情况下能保证是幂等的,和推送顺序就无关了。

@Liubey
Copy link
Author

Liubey commented Jan 18, 2019

懂了,多谢,那其实如果TCP 长连接只是推送更新通知后再拉取也是没有双写问题的

@nobodyiam
Copy link
Member

case先关闭了,如还有问题,可以提供更多信息,或进群交流。

@dumbdonkey
Copy link

如果在短时间内配置变化了两次,且采用了通知变化时传输配置的形式,那两次通知的配置一个新一个旧。

抵达客户端后由于线程切换的关系,无法保证一定先update旧的配置,再update新的配置,所以可能会导致配置不正确。

所以apollo没有采用这种方式,而是只推送通知,由客户端从服务端拉取最新配置,这种情况下能保证是幂等的,和推送顺序就无关了。

那为什么不用单线程进行更新呢?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants