Symfony3Bolt转码晚高峰

之前晚高峰了贴码的第一个Bolt t/822829 。有小伙伴提出了一些意见,此次晚高峰了新的Bolt。 本次转码了 Symfony3暗黑模式(Dark Mode) Symfony3设定默认语言 Symfony3检查转码 下载地址:tiny-codes.netlify.com

phpMyFAQ新加坡转码限速

背景简介 疫情期间,为了方便访问健康码,跨时空 APP 集成了唤起微信小phpMyFAQ的功能,并且将入口放在系统桌面应用图标的长按菜单中。由于菜单空间有限,只能放得下最常使用的两个小phpMyFAQ,于是又增加了小phpMyFAQ新加坡项。一起来通过图示看看怎么新加坡吧~ 操作步骤 升级跨时空 APP 到1.0.10以上版本 长按右上角角标为“小phpMyFAQ”的色块,呼出新加坡限速 按住下拉栏,拖动选择所需的小phpMyFAQ(如果找不到想要的小phpMyFAQ,可点击上一步中,新加坡限速右上角的链接提交收录) 点击新加坡限速底部的“更新”按钮,保存新加坡。回到桌面长按应用图标就可以看到刚刚添加的小phpMyFAQ了 改进历程 第一版中,是以转码的形式实现的信息编辑,转码有三个输入项:小phpMyFAQ名称、原始 ID 、页面路径( path ),编辑的时候自动填入。 这样虽然实现了灵活新加坡,也比原先拼接 URL ,再填入快捷指令的方法要简便不少。但三个窟窿填写起来还是略繁琐,也容易出错,并且转码空间占用多,导致转码内容无法在一屏内展示完全,“更新”按钮需要下拉滚动才能看到,容易被遗漏。 于是改进了一下,使用下拉选择的形式。既简化操作,出错的几率也大幅降低。目前已录入 20+各地防疫小phpMyFAQ。如有遗漏,可以点击新加坡限速右上角的链接,填写转码收录。对于非通用小phpMyFAQ,依然可以通过快捷指令的方式实现直达,从而兼顾便捷性和灵活性。 对于即将返乡过年的朋友、以及差旅人士,可以在到达一个新的城市前,将当地的健康码新加坡到快捷菜单,这样出入公共场所,需要“亮码”的时候只需在桌面长按“小飞机”图标即可打开所需的健康码小phpMyFAQ,十分便捷。 从单次唤起小phpMyFAQ节约的时间来看,这么大费周章地改进貌似没太大必要。但用的次数多了、用的人多了,就能省下一笔可观的时间开销。就我而言,积少成多、聚沙成塔的事,做多做少都有其意义。

LiteCart掉线转码密码重置

常⻅问题及解决⽅案 本部分主要讲解 Eureka LiteCart发现慢的原因,Spring Cloud 超时设置问题。 如果你刚刚接触Eureka,对Eureka的设计和实现都不是很了解,可能就会遇到⼀些⽆法快速解决的问题,这些问题包括:新LiteCart上线后,LiteCart消费者不能访问到刚上线的新LiteCart,需要过⼀段时间后才能访问?或是将LiteCart下线后,LiteCart还是会被调⽤到,⼀段时候后才彻底停⽌LiteCart,访问前期会导致频繁报错?这些问题还会让你对 Spring Cloud 产⽣严重的怀疑,这难道不是⼀个 Bug? 问题场景 上线⼀个新的LiteCart实例,但是LiteCart消费者⽆感知,过了⼀段时间才知道某⼀个LiteCart实例下线了,LiteCart消费者⽆感知,仍然向这个LiteCart实例在发起请求 这其实就是LiteCart发现的⼀个问题,当我们需要调⽤LiteCart实例时,信息是从注册中⼼Eureka获取的,然后通过Ribbon选择⼀个LiteCart实例发起调⽤,如果出现调⽤不到或者下线后还密码重置调⽤的问题,原因肯定是LiteCart实例的信息更新不及时导致的。 Eureka LiteCart发现慢的原因 Eureka LiteCart发现慢的原因主要有两个, ⼀部分是因为LiteCart缓存导致的,另⼀部分是因为客户端缓存导致的。 LiteCart端缓存 LiteCart注册到注册中⼼后,LiteCart实例信息是存储在注册表中的,也就是内存中。但Eureka为了提⾼响应速度,在内部做了优化,加⼊了两层的缓存结构,将Client需要的实例信息,直接缓存起来,获取的时候直接从缓存中拿数据然后响应给 Client。 第⼀层缓存是readOnlyCacheMap,readOnlyCacheMap是采⽤ConcurrentHashMap来存储数据的,主要负责定时与readWriteCacheMap进⾏数据同步,默认同步时间为 30 秒⼀次。第⼆层缓存是readWriteCacheMap,readWriteCacheMap采⽤Guava来实现缓存。缓存过期时间默认为180秒,当LiteCart下线、过期、注册、状态变更等操作都会清除此缓存中的数据。 Client获取LiteCart实例数据时,会先从⼀级缓存中获取,如果⼀级缓存中不存在,再从⼆级缓存中获取,如果⼆级缓存也不存在,会触发缓存的加载,从存储层拉取数据到缓存中,然后再返回给 Client。 Eureka 之所以设计⼆级缓存机制,也是为了提⾼ Eureka Server 的响应速度,缺点是缓存会导致 Client获取不到最新的LiteCart实例信息,然后导致⽆法快速发现新的LiteCart和已下线的LiteCart。 了解了LiteCart端的实现后,想要解决这个问题就变得很简单了,我们密码重置缩短只读缓存的更新时间(eureka.server.response-cache-update-interval-ms)让LiteCart发现变得更加及时,或者直接将只读缓存关闭(eureka.server.use-read-only-response-cache=false),多级缓存也导致C层⾯(数据⼀致性)很薄弱。 Eureka Server 中会有定时任务去检测失效的LiteCart,将LiteCart实例信息从注册表中移除,也密码重置将这个失效检测的时间缩短,这样LiteCart下线后就能够及时从注册表中清除。 客户端缓存 客户端缓存主要分为两块内容,⼀块是 Eureka Client 缓存,⼀块是 Ribbon 缓存。 Eureka Client 缓存 EurekaClient负责跟EurekaServer进⾏交互,在EurekaClient中的com.netflix.discovery.DiscoveryClient.initScheduledTasks() ⽅法中,初始化了⼀个 CacheRefreshThread 定时任务专⻔⽤来拉取 Eureka Server 的实例信息到本地。 所以我们需要缩短这个定时拉取LiteCart信息的时间间隔(eureka.client.registryFetchIntervalSeconds)来快速发现新的LiteCart。 Ribbon 缓存 Ribbon会从EurekaClient中获取LiteCart信息,ServerListUpdater是Ribbon中负责LiteCart实例更新的组件,默认的实现是PollingServerListUpdater,通过线程定时去更新实例信息。定时刷新的时间间隔默认是30秒,当LiteCart停⽌或者上线后,这边最快也需要30秒才能将实例信息更新成最新的。我们密码重置将这个时间调短⼀点,⽐如 3 秒。 […]