当前位置:网站首页>Saying bybybye to message delay: a scheme for timely arrival of idle fish message (detailed)

Saying bybybye to message delay: a scheme for timely arrival of idle fish message (detailed)

2021-01-23 22:11:17 InfoQ

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" background "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IM News is an important trading consulting tool for idle fish users , There are two core objectives , The first is to ensure that users' messages are not lost , The second is to ensure that the user's message is delivered to the receiver in time .IM The message depends on whether the receiving device of the message is online , Divided into offline and online push , Data show that more than half of the fish are idle every day IM News is online , And the arrival rate of online messages 、 Timeliness has a direct impact on the user experience , This paper will focus on the stability of the optimized online channel , Ensure that user messages arrive in time ."}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" What problems are we facing "}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" End to end long connection interrupted "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" stay IM Scene , Users communicate with the cloud frequently , And in order to realize the timely arrival of user's message , Users are often reached by pushing messages from the cloud , So when the user is online, the device and the cloud will maintain a line TCP Long connection channels , It can interact with the server more lightweight , modern IM Instant messaging downlink messages are sent through the long link , Idle fish news uses ACCS A long connection ,ACCS It's full duplex provided by Taobao wireless 、 Low delay 、 High security channel service . However, due to the uncertainty of user equipment network state , A variety of network anomalies may occur, leading to the interruption of long connection channels , Once the long connection is interrupted unexpectedly , Users will not be able to receive online messages in time , So we need to sense the interruption of long-term connection as soon as possible and try to re connect ."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/3e\/3ee2ffa869d1360c220ecf925bac3bb5.png","alt":" picture ","title":"null","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" The message pushed down didn't reach "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Sensing long connection interruption and reconnection can only guarantee the validity of long connection most of the time , However, during the period of invalid or unstable long connection, the message pushed down may not be received by the client at all , Simply put, only the reconnection mechanism can not guarantee that the downlink messages will arrive , There may be the following scenarios that cause the downlink message to fail :"}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The server sends the downlink message for a long time , The message is broken on the transmission path , The client cannot receive  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" There is a delay in the online state of the device , The server thinks that the device is online when sending messages , In fact, the device is offline , Can't receive  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The client received a downlink message , But the subsequent processing on the end fails , For example, the failure of the inventory , The message was not successfully presented to the user "}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" We get from the statistics of data buried points ,accs The success rate of downlink is 97% about "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/fc\/fc8d59a58fb3fa0c4d8247c70269104b.png","alt":" picture ","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" There are anxious students to ask , lost 3% The news of ? did not , this 3% You can't lose your message , It's just not guaranteed to reach users in time . Our message synchronization model is push-pull mode , When users pull messages, they will pull all messages of the current site of the device and the latest site of the server ,accs The message of downlink failure will be obtained through active pull mode , However, the trigger time for the client to actively pull messages is limited , There are mainly the following :"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" User cold start app, Actively synchronize messages  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Users take the initiative to pull down refresh  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"app The background switches to the foreground  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Received a push message , The location of the new message found by the client is the same as that of the local latest message gap, Trigger synchronization "}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" It can be seen that the triggering of the above active synchronization messages largely depends on the user's behavior or whether a new message has been received , It's hard to guarantee that the news will arrive in time . If it's the user's high frequency IM Software , It won't be a big problem , But idle fish app The level of activity is low , Sometimes even rely on IM News enlivens , And a delayed message can cause users to miss a transaction , No such delay is allowed for idle fish messages . Based on the above analysis , Let's first describe a data indicator to reflect the status quo , It can be seen from the above description ,accs The news is not all pushed down , It could be pulled down on its own , If it's push , Sure to arrive in time , If it's La , Is limited to user behavior . This part of LA's news , We define it as accs Message compensation arrives , And then calculate accs Message compensation arrival time , The message scope is limited to the server accs The downlink is successful, but the client actively pulls the synchronized message , Previous versions of this data in 60 About minutes . It should be noted that this data is not the time taken for the message to reach the user , Because if online to offline touch , The time to pull a message depends on user behavior ( When did the user open app), But this data can also roughly reflect the arrival delay of online messages ."}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/79\/791ca1e55bc32df8e601b0e2445a3fbe.png","alt":" picture ","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Next, this article will describe in detail how we optimize the stability of online channels from two aspects: reconnection of long connections and resending of missed messages ."}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" Long connection reconnection "}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" Why is the long connection broken ?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" A hundred causes have fruit , Let's first analyze what causes the connection to be interrupted , There may be the following reasons : "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The user equipment is disconnected  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The device has a network switch  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The device is in a weak network environment , Network instability  "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The device network is normal ,TCP The connection is due to NAT The timeout caused the connection to be interrupted by the operator "}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" If it is the user's operation that causes the network state to change , There will be network state change event notification , In this case, you can listen for events and try to reconnection actively , But most of the reality is “ unexpected ”. So how to effectively sense all kinds of abnormal conditions ?"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" The heartbeat detection "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Like most live scenes , The most effective detection method is heartbeat detection , The client sends heartbeat packets regularly , You can sense that the connection is broken , From the perspective of timeliness effect , The shorter the heartbeat interval, the better , And frequent heartbeat detection is bound to bring the loss of user traffic and power , So our goal is how to detect the heartbeat as little as possible and sense the unexpected situation of long-term interruption as timely as possible ."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" State machine + Message heartbeat queue :"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/12\/129fecbcf6211007da940ce0596a23ce.png","alt":" picture ","title":"null","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" In the design of heartbeat protocol , It should be noted that the core goal of heartbeat packet is to detect whether the long connection channel is unblocked , The client actively uplink the heartbeat packet and receive the server return packet , I think the Changlian channel is healthy , So the uplink messages and packets returned should be as small as possible , Generally speaking , Identify heartbeat packet and response through protocol header "}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" Heartbeat strategy "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Heartbeat strategy is the core mechanism to achieve our above goals , But you can even write a separate article on the detailed design of heartbeat strategy , This article simply lists several heartbeat strategies , Interested students can read the article recommended at the end of the article to continue in-depth study ."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Short heartbeat detection The initial state is continuous ping 3 Time received ack after , It can be said to be in a stable state "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Regular long heartbeat ( according to app Different states , The frequency is adjustable Mid+,Mid-, Long)"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Adaptive heartbeat Automatically adapt to the heartbeat interval according to the change of device network state "}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Redundant heartbeat ,app The backstage cuts to the front desk , Active heartbeat once "}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" news ack And resend "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" To solve the above problems , Import message ack And the retransmission mechanism , The whole idea is that the client receives accs After the message is processed successfully , Give the server a ack, Server down accs Add the message to the retrial queue when the message is sent , received ack Update message arrival status after , Stop and try again ."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Overall design flow chart :"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/71\/711c51a9ba58dc14089f5dfcca171162.png","alt":" picture ","title":"null","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The difficulty of the scheme is the design of the retrial processor , Next, we will focus on the detailed design of this part "}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" Retrial queue storage design "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" We use alicloud form storage TimeLine Model to store the arrival state of downlink messages , Alicloud table storage is a multi model structured data storage developed by alicloud , Provides massive structured data storage and fast query and analysis services . The distributed storage of table storage and powerful index engine can support PB Levels of storage 、 Ten million TPS And the ability to service with millisecond latency . and Timeline Model is a data model designed for message data scenario , It can satisfy the message data scenario and keep the message order 、 Massive message storage 、 The special needs of real-time synchronization , stay IM、Feed Flow and other message scenarios are widely used ."}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" We define one for each user device TimeLine,timeline-id Defined as userId_deviceId,sequenceId Custom as message site , The storage structure is as follows : "}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/27\/27ac3fd17ae55c1af39c6c1394204c80.png","alt":" picture ","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Every time I pass accs Successfully dropped a message , Then insert into the TimeLine in , received ack According to the news id Update message arrival status , At the same time, because the retrying action only occurs in a short period of time after the downlink message , So we can set a relatively short global expiration time , Avoid data inflation ."}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" Delay retrying design "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/dd\/ddbab3e77d82e787bc54daebd862cd4d.png","alt":" picture ","title":"null","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1) Every time I pass accs Send a message , Insert into Timeline in , The initial state is not reached , And then produce a delay N Second delay message  "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2) Every time you consume a delayed message , Read tablestore The arrival status of the message in , If it arrives, it will be terminated , Otherwise continue  "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3) Each time you try again, first judge whether the device is online , If the device is not online , Forward the offline channel and terminate the retry , If the device is online , Then push the unreachable message again , And delay again N Second consumption  "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4) The same delayed message used in the retrial life cycle of each message , At most M Time , If the number of times exceeds, do not try again and log buried points , This situation can be monitored later and optimized based on this data "}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" Delay retransmission strategy "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Delay retransmission strategy refers to in the retransmission process , How to choose the appropriate delay time to maximize the efficiency of retransmission . Different users at different times 、 The network environment of the location is quite different , There are also differences in the time required for the network to return to a stable state , We need to choose the appropriate delay strategy to ensure the retransmission efficiency , The goal of the optimal delay strategy is in the shortest time , Use the minimum number of resends to deliver the message successfully ."}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":" Fixed delay time "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" To find the optimal delay strategy , You have to analyze the data to get the answer , Imagination is often far from reality , Let's start with a fixed delay time (10s) Maximum retry 6 Let's analyze a wave of data "}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/f1\/f10014de08eaec59991b7fecaeb87c59.png","alt":" picture ","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" We can see from this data that , About 85% The news of 40s Internal resend can be delivered successfully , also 12% The message of is still not received after reaching the maximum number of retries ack, stay 4 After three retries , The first 5 The first success is 2.03%, The first 6 Next time only 0.92%, The benefits of continuing to resend have become very low ,6 There are still some messages that haven't been received since ack, If you use a fixed delay policy for this part of the message , Low cost performance , Frequent retransmission wastes system resources , We continue to improve our strategy ."}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":" Fixed delay + Fixed step increment "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Considering that the network of some users cannot be recovered in a short time , Frequent short interval retransmissions are of little value , We use 4 Second fixed short interval delay N Seconds later , After that, the delay time is increased by a fixed step by the last delay time M Second strategy , Until receipt ack、 The user device is offline or reaches the maximum delay time MAX(N). This strategy can solve the problem of fixed delay retransmission strategy to some extent , But if the user's network cannot be recovered in a short time , Every retransmission has to be incremented , It's not an optimal solution ."}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":" Adaptive delay "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Design flow chart :"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/90\/9031eb5457ad15c70d059a7f478f146e.png","alt":" picture ","title":"null","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Pictured above , We finally derive the adaptive delay strategy , Adaptive delay refers to the delay according to the user's network condition , Take automatic adjustment of delay time , In order to achieve the highest retransmission efficiency , New news goes through first 4 Second fixation N Second delay to detect the network status of the device , Once the network is restored , We're going to have the device N Value clear , equipment N Value means based on the experience of previous resends , The current device network can reply ack The shortest time needed , By default, the value is empty , On behalf of the user equipment network is normal .4 I still can't get it after this retransmission ack, We try to read the device N value , If it is empty , Then take the initial value , After that, each delay is incremented by a fixed step size M, And update the current device after retransmission N value , Until the message arrives ack Or the maximum delay time is reached MAX(N)."}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":" Compatibility between new and old versions "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" It's important to note that the old version of app It won't come back ack Of , If the message sent to the old version of the device is also added to the retrial queue , Such messages will not terminate until the maximum number of retries , Consume resources for no reason , So we design in accs After the establishment of the company , The client actively uplink a device message , It includes app Version number of , The server stores for a certain period of time , Before adding a message to the retrial queue , Check the receiver's device first app Version number of , Meet the requirements and then join the retrial queue ."}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" The effect of the scheme "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" After the message reconnection and retransmission scheme goes online , The indicators we defined above accs Compensation arrival time from 60 The number of minutes dropped dramatically to 15 minute , A drop of 75%, This confirms our technical analysis , At the same time, users' public opinion feedback on message delay should not exceed 2 individual , It can be seen that the message retransmission mechanism has a significant effect on ensuring the timely arrival of user messages ."}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":" Future outlook "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" The optimization of message online channel stability has come to an end , In the future, we will continue to optimize the experience of using idle fish news , Including the improvement of basic functions and the improvement of basic experience ."}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" In terms of basic functions , We have supported message recall in recent releases 、 Draft function , In the future, it will gradually support sending and positioning , Session grouping 、 remarks , Message search and other functions ;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Basic experience , We're interested in the news of free fish UI The style has been optimized and upgraded , And optimized app news tab page cpu And memory usage , The follow-up will continue from traffic 、 Electric quantity 、 Continue to optimize the message experience in terms of performance ."}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"References"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"[1]"}]},{"type":"text","text":" modern IM Message system architecture in the system - Architecture : "},{"type":"text","marks":[{"type":"italic"}],"text":"https:\/\/developer.aliyun.com\/article\/698301"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"[2]"}]},{"type":"text","text":" modern IM Message system architecture in the system - Model : "},{"type":"text","marks":[{"type":"italic"}],"text":"https:\/\/developer.aliyun.com\/article\/701593"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"[3]"}]},{"type":"text","text":" High concurrency IM System architecture optimization practice : "},{"type":"text","marks":[{"type":"italic"}],"text":"https:\/\/developer.aliyun.com\/article\/66461"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Reprinted from : Free fish technology (ID:XYtech_Alibaba)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" Link to the original text :"},{"type":"link","attrs":{"href":"https:\/\/mp.weixin.qq.com\/s\/-x0hKwKAsPfB9V6FoJWcLA","title":"xxx","type":null},"content":[{"type":"text","text":" Say to the message delay bybye: Free fish news arrives in time ( detailed )"}]}]}]}

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/01/20210123221032329v.html

随机推荐