<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>CDN on Micah&#39;s Space</title>
    <link>https://micah.wiki/tags/cdn/</link>
    <description>Recent content in CDN on Micah&#39;s Space</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 09 Jun 2022 15:09:21 +0800</lastBuildDate>
    <atom:link href="https://micah.wiki/tags/cdn/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>图片服务整体架构</title>
      <link>https://micah.wiki/posts/1.learning/a3.reflections/devops/pic-app/</link>
      <pubDate>Thu, 09 Jun 2022 15:09:21 +0800</pubDate>
      <guid>https://micah.wiki/posts/1.learning/a3.reflections/devops/pic-app/</guid>
      <description>&lt;h2 id=&#34;1背景&#34;&gt;1.背景&lt;/h2&gt;&#xA;&lt;p&gt;面向海外用户设计图片类app的后端架构。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-目标&#34;&gt;2. 目标&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;考虑跨地区访问图片列表。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;图片容灾和备份服务。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;用户访问突增的解决方案。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;海外服务政策相关注意事项。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;3-方案图片&#34;&gt;3. 方案（图片）&lt;/h2&gt;&#xA;&lt;p&gt;ps：这里先统一考虑图片的设计过程，图片解决后，再考虑业务后台过程&lt;/p&gt;&#xA;&lt;h3 id=&#34;31-自研&#34;&gt;3.1 自研&lt;/h3&gt;&#xA;&lt;h4 id=&#34;方案设计&#34;&gt;方案设计&lt;/h4&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.shijinping.cn/picgo/202206101026771.png&#34; alt=&#34;v1.drawio&#34;&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;分布式文件系统：采用开源系统进行搭建分布式文件系统&lt;/li&gt;&#xA;&lt;li&gt;文件系统服务：可以新增图片时可以生成索引返回给业务，当业务只需要根据索引，就能查询到对应的文件内容&lt;/li&gt;&#xA;&lt;li&gt;业务层：上传服务主要负责图片的上传、而列表服务则是需要根据请求，获取列表及数据&lt;/li&gt;&#xA;&lt;li&gt;接入层：接收用户的请求，把请求代理到业务上&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这么设计，可以实现一个图片类的应用。在实际中会有什么问题？&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;不同区域的用户，体验不一样，用户离部署的节点越近，用户体验更好&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;因为根据之前的经验，地域对于网络的延迟影响很大。大致从ping上就能体现&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;地区1&lt;/th&gt;&#xA;          &lt;th&gt;地区2&lt;/th&gt;&#xA;          &lt;th&gt;ping时间&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;上海&lt;/td&gt;&#xA;          &lt;td&gt;广州&lt;/td&gt;&#xA;          &lt;td&gt;30ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;上海&lt;/td&gt;&#xA;          &lt;td&gt;上海&lt;/td&gt;&#xA;          &lt;td&gt;10ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;上海&lt;/td&gt;&#xA;          &lt;td&gt;美国&lt;/td&gt;&#xA;          &lt;td&gt;100ms&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;从终端的成功率上看，由于网络上的丢包、延迟，成功率会低很多，特别是图片（目前图片1～3M都是比较正常的），这么大的图片，在过程中，发生丢包、延迟，失败率可想而知，会特别的高。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这种场景，我们可以考虑下，访问国外某些网站的时候，经常是失败，体验非常差&lt;/p&gt;&#xA;&lt;h4 id=&#34;改进点&#34;&gt;改进点&lt;/h4&gt;&#xA;&lt;p&gt;那么需要怎么改进呢？&lt;/p&gt;&#xA;&lt;p&gt;比较容易想到的就是，既然是距离远，那么直接在对应的地方部署一个服务，不就行了么？&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.shijinping.cn/picgo/202206101104619.png&#34; alt=&#34;v2.1.drawio&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这样各地的用户，通过dns的调度，访问对应的接入层，接入层只访问当前区域的服务（同一个区域），这样就减少了网络上的问题。解决了用户体验。但是，好像跟需求不是太耦合。。。需求是&lt;code&gt;跨区域访问&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;那么要怎么样实现跨区域访问呢？&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.shijinping.cn/picgo/202206101109613.png&#34; alt=&#34;v2.3.drawio&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从图上可以看出来，如果底层数据实现了数据同步，那么是不是就可以了？&lt;/p&gt;&#xA;&lt;p&gt;比如亚洲用户发布内容，那么我们把数据同步给其他集群，这样其他集群就可以访问到亚洲用户的信息了&lt;/p&gt;&#xA;&lt;p&gt;要怎么实现同步呢？目前了解到**&lt;code&gt;FastDFS&lt;/code&gt;**可以实现分布式任务系统的，他是采用binlog进行同步，在log中有个标志位用户记录该条记录是&lt;code&gt;C: 增加 D: 删除 A: 添加 M: 修改 U: 更新整个文件 T: 截断文件&lt;/code&gt; 等，当亚洲区域进行添加时，会发送日志给美洲、欧洲，他们也会根据binlog的日志添加，这里需要注意：同步数据采用的标识与写入的是不一样的，采用小写，目的是为了区别是否需要同步给其他集群。&lt;/p&gt;&#xA;&lt;p&gt;这里还没有对FastDFS跨区同步进行测试过，还不确定具体的延迟能够到达多少（有待验证）。&lt;/p&gt;&#xA;&lt;p&gt;理论上，上面的方案是可以实现的，那么我们会有什么问题呢？&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;所有图片数据，都存在多份，每个数据都需要进行公网的同步。&lt;/li&gt;&#xA;&lt;li&gt;文件传入与数据传输需要保证一致，不能有数据了，没有文件&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;那么我们有没有其他方案进行呢？下面我们来看下&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.shijinping.cn/picgo/202206101614227.png&#34; alt=&#34;v2.4.drawio&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于图片，可以采用CDN加速。&lt;/p&gt;&#xA;&lt;p&gt;对于API接口了解到市面上，有一种产品，叫做“全站加速”或者“动态加速”，也就是cdn不进行缓存，直接访问，这样的话，我们可以直接让用户访问，这样的话，所有数据都访问了中心区域的数据，通过“动态加速”把用户和源进行连接，核心是增加了数据传输的稳定性，降低失败率。&lt;/p&gt;&#xA;&lt;p&gt;这种方式存在什么问题：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;数据量问题：&lt;/p&gt;&#xA;&lt;p&gt;a) 扩容问题：这个也不算特别问题，是项目一般都会遇到&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
