精华内容
下载资源
问答
  • 2017-12-06 10:04:25

    以前各大平台都很流行 流行使用电脑协助自己工作 但是科技越来越强大 一下子跟以前不一样了 手机成为了人们的主流    
    现在我想 告诉大家 推广方式 现在大家都在推荐自己的产品 但是不知道如何 去推广,去营销   前几年的时候 我父亲是做 服装的 开始推广的时候都是靠客户的推荐 后来慢慢改变了 现在行业竞争大了 而且很不实际  
    各大媒体看到 你知道有哪些 采购软件 哪个多客户? 慧聪网站,阿里巴巴,采购网。雀搜
    客户经常这么说: 告诉你吧 采购网站大多没人用 好用的只有几个 雀搜采购 想要采购什么,直接搜索     你还可以去看一下 其它阿里巴巴、珠三角采购 再看看咯
    大家知道吗?雀搜是唯一一个能满足客户需求的采购平台 雀搜的资源真的有那么多吗? 电脑端手机端都有 这样的采购平台估计很受群众欢迎     
    雀搜在国内是一个怎样的平台 电脑端手机端都有 数据精准方便快捷 节省了我很多的时间 假如你是从事 汽配行业,那么汽车采购平台一定能帮到你的 我们这里有这个行业数千条相关数据自动匹配 你单位里的 防尘口罩
    信息非常精准 只要在雀搜平台发布信息都是免费的 只要打开手机,随时随地都能发布你的信息 那就不像其它平台那样反复去找商品 在雀搜找到自己想要的东西,直接购买了完成了    
    主打信息免费发布 他们承诺这个CRM客户管理系统是永久免费的 这个功能很方便,主要体现在 可以同时发布好几样产品 让产品有效的发布出去 发布的信息不在丢失 发布的质量也得到保障

    更多相关内容
  • Redis实现消息队列之发布订阅模式

    千次阅读 2020-06-18 01:06:09
    发布订阅(pub/sub)是一种消息通信模式:发送者(pub)某一频道发送消息,订阅者(sub)接收消息发布订阅模式类似与微博关注,比如说博主mango被张三、李四、王五关注,那么mango发一篇微博的时候张李王三人都会从...

    发布订阅(pub/sub)是一种消息通信模式:发送者(pub)在某一频道发送消息,订阅者(sub)接收消息。发布订阅模式类似与微博关注,比如说博主mango被张三、李四、王五关注,那么mango发一篇微博的时候张李王三人都会从关注里看到这条微博。

    那么发布订阅和生产消费有何异同之处呢?生产消费主要是生成一个消息只能被一个客户端消费,而发布订阅可以理解为发布一条消息,在该频道中的所有客户端都会收到,所以有时候我们这个发布订阅类似广播。

    注意pubsub是一个数据结构。

    Pub/Sub(发布订阅)

    前面提到客户端能接受到消息首先要订阅频道,那么redis中的订阅命令subscribe channel [channel ...] 这里可以订阅多个频道。订阅后我们需要发布消息到这个频道中publish channel message。

    ####订阅test频道> subscribe testReading messages... (press Ctrl-C to quit)1) "subscribe"2) "test"3) (integer) 1
    ####发布信息> publish test 'hello'(integer) 1

    不是可以广播嘛,那么我们再起一个客户端

    当然redis还提供退订unsubscribe 跟subscribe 的使用方式一样。

    PUBSUB命令

    PUBSUB是一个查看订阅与发布系统状态的内省命令,它由数个不同格式的子命令组成。

    PUBSUB CHANNELS [pattern] 列出当前的活跃频道。活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的客户端不计算在内。

    pattern 参数是可选的:

    • 如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。

    • 如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。

    > pubsub channels1) "test"

    PUBSUB NUMSUB [channel-1 ... channel-N] 列出当前的活跃频道和返回连接数

    > pubsub numsub test1) "test"        #频道2) (integer) 2   #连接数> pubsub numsub test11) "test1"2) (integer) 0

    PUBSUB NUMPAT 返回订阅模式的数量。

    注意,这个命令返回的不是订阅模式的客户端的数量,而是客户端订阅的所有模式的数量总和,可以理解为模式匹配,例如订阅一个test*,客户端能接收test、test1、test2等等这样的,看下面例子。

    ####客户端> psubscribe test*Reading messages... (press Ctrl-C to quit)1) "psubscribe"2) "test*"3) (integer) 1
    > pubsub numpat(integer) 1

    模式匹配订阅

    介绍完发布订阅的一般模式,此时我们小伙伴就问,长得跟mango一样的我能不能订阅呢?当然redis是支持这种模糊订阅的,其命令为psubscribe,跟subscribe使用方式一致。

    > psubscribe test*Reading messages... (press Ctrl-C to quit)1) "psubscribe"2) "test*"3) (integer) 1

    PubSub原理

    我们直到redis是key-value键值对的字典,PubSub前面讲过是一个数据结构,那么它是如何存储在内存中的呢?看老夫画图来解答。

    我们从图中可以看到每个频道放入字典数组中,对应频道的订阅者则放入链表中,当我们发送一个publish命令时,首先字典数组遍历找到对应的频道,然后找到对应的订阅链,依次发送消息。

    所以我们可以看出每次发送消息时我们的都需要遍历这个字典,也就是说它的执行时间效率为O(n),但是我们redis的宗旨是快,减少执行O(n)的命令,这违背了我们当初的初衷

    PubSub的缺点

    PubSub的发布者传递过来一个消息,Redis会直接找到相应的订阅者传递过去。如果一个订阅者都没有,那么消息会被直接丢弃。如果开始有三个订阅者,第三个订阅者突然挂掉了,发布者会继续发送消息,另外两个订阅者可以持续收到消息,但是当挂掉的订阅者重新连上的时候,在断连期间发布者发送的消息,对于这个发布者来说就是彻底丢失了。
    如果Redis停机重启,PubSub的消息是不会持久化的,毕竟Redis开机就相当于一个订阅者都没有,所有的消息会被直接丢弃。正是因为PubSub有这些缺点,在消息队列的领域它几乎找不到合适的应用场景。
    所以Redis的作者单独开启了一个项目Disque专门用来做多播消息队列,不过该项目目前没有成熟,直处于Beta版本。

    填坑——为什么Redis不适合做消息队列

    1.难以保证消息队列的ACK,消息发送出去后没有一个回馈过程,消息无法做持久化

    2.如果保证消息持久化,那么必定损失性能,首先我们需要把消息存入磁盘,然后从磁盘中读取数据到内存去操作,这个过程是非常耗时的

    3.PubSub执行效率低,执行效率是O(n),违背了redis设计初衷

    4.难以实现复杂的消息模式

    如果需要用到消息队列,还得需要使用专业的消息队列,毕竟这个技术已经相当成熟了

     

    一名正在抢救的coder

    笔名:mangolove

    CSDN地址:https://blog.csdn.net/mango_love

    GitHub地址:https://github.com/mangoloveYu

    展开全文
  • 11 月 19 日,历史上的今天,Twitter 的创始 Jack Dorsey 出生;Drupal 内容管理系统创始 Dries Buytaert 出生;微软首次发布 Microsoft Office;Amazon 发布第一代 Kindle;谷歌以 Chromium 的名义开源 Chrome ...

    整理 | 王启隆

    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。

    今天是 2021 年 11 月 19 日,在 5 年前的今天,世界首个光子神经网络诞生;来自普林斯顿大学的 Alexander N. Tait 等科学家在 arXiv 上发表了一篇题为《神经形态硅光子学》的论文,介绍了世界上首个光子神经网络,有望能大幅提升神经网络的性能。以机器学习神经网络为代表的人工智能技术正在改变我们生活的许多方面,回顾科技历史上的今天,世界各地又诞生了哪些关键事件呢?

    1976 年 11 月 19 日:Twitter 的创始人 Jack Dorsey 出生

    杰克·多西(Jack Patrick Dorsey)出生于 1976 年 11 月 19 日,他是美国软件工程师和科技创业者,Twitter 联合创始人兼 CEO,Square 的创始人兼 CEO。2020 年 4 月 8 日,杰克· 多西宣布捐献他财产的 28%,即 10 亿美元用来抗击新冠病毒。

    在这里插入图片描述

    图源:维基百科

    多西的青少年时期长大在密苏里州圣路易斯,他的家族有英格兰、爱尔兰和意大利血统;多西的父亲在一家生产光谱仪的公司工作,母亲是家庭主妇。多西 14 岁时对软件开发产生了兴趣,当时他开发的开源路由调度软件至今仍有在出租车公司使用。1995 年,多西入读密苏里科技大学,1997 年转入纽约大学,后来他前往加利福尼亚当程序员。

    2000 年,多西在奥克兰开办了自己的公司,通过网页来调度信使、出租车和紧急服务;期间他还产生了其他项目和想法,包括媒体设备网络和平滑市场服务。2000 年 7 月,在构建调度的同时,受到当时互联网的许多新兴软件的启发,多西开始对实时通讯有了想法。

    在首次看到即时通讯的实现后,多西开始考虑软件用户的状态能否更简易地在朋友间实现共享;他与当时从事短信服务的 Odeo 公司接触,并找到了比兹·斯通。多西和斯通认为 SMS 文本能够用作状态消息,于是他们花两周时间构建了 Twitter 的原型,这个主意立刻吸引了 Odeo 公司的许多人。当时,埃文·威廉姆斯刚将 Pyra Labs 和 Blogger 出售给 Google,并离开了 Google,他发现了多西的才能和 Twitter 的商机,立即投资到其中。

    2007 年 4 月,在一个声势浩大的成立仪式后,多西、威廉姆斯和斯通开始正式运营 Twitter,公司 CEO 由多西担任。经过数年的发展,用户发布的 Twitter 信息从 2007 年初的每天 5000 条增加到现在的每天 7000 万条,人们通过 Twitter 更新自己的活动信息、分享新闻、愉悦粉丝。2012 年底,多西又创立了移动支付公司 Square。

    Twitter 的用户经常畅谈自由,不过多西认为,Twitter 既不属于自由派,也不属于保守派,而是类似于一个公共事业,就像水和电;多西的人生目标是让信息更加自由地传播流动,让世界变得更加公平、友善、美好,“我喜欢不带偏见的技术。”

    资料来源:维基百科

    1978 年 11 月 19 日:Drupal 内容管理系统创始人 Dries Buytaert 出生

    在这里插入图片描述

    图源:维基百科

    Dries Buytaert 出生于 1978 年 11 月 19 日,他是一位比利时程序员,自由开源内容管理系统软件 Drupal 的作者兼首席开发者。Dries 于 2008 年 1 月 27 日在比利时根特大学进行了计算机科学博士学位论文的答辩,从 1999 年到 2000 年,他一直担任着 Linux-WLAN FAQ. 的维护者。

    2007 年 12 月 1 日,Dries 宣布和联合创始人 Jay Batson 一起启动一个名为 Acquia. 的创业公司。Acquia 是一家商业开源软件公司,为 Drupal 提供产品、服务和技术支持;Acquia 试图成为 Drupal 的招牌,就像 Red Hat 对于 Linux 一样。

    2008 年 3 月 31 日,Dries 推出了 Mollom,一项致力于阻止网站垃圾邮件的服务:“Mollom 的目的是大幅减少保持网站整洁和内容高质量的努力。目前,Mollom 是最先进的垃圾邮件过滤器和验证码服务器的组合拳,可以消灭垃圾邮件。”超过 59,000 个网站受到 Mollom 服务的保护,包括 Netlog 的所有信息 Mollom 的支持,并于 2018 年 4 月 2 日结束。

    资料来源:维基百科

    1990 年 11 月 19 日:微软首次发布 Microsoft Office

    Microsoft Office 是由微软公司开发的办公软件套装,与其他办公室应用程序一样,它包括联合的服务器和基于互联网的服务。从 2007 版的 Office 被称为“Office System”而不叫“Office Suite”,反映出它们包括服务器的事实。Office 常是制作文档文件的标准,而且有一些其他产品不存在的特性,但是其他产品也有 Office 缺少的特性;自从 Microsoft 2007 Office System 开始,Office 采用了被称为 Ribbon 的新界面风格,并沿用至今。

    Office 最初是一个推广名称,出现于 1990 年代早期,指一些以前曾单独发售的软件的合集。当时主要的推广重点是:购买合集比单独购买要省很多钱。最初的 Office 版本包含 Word、Excel 和 PowerPoint。微软目前将 Office 延伸作为一个开发平台,可以借由专用商店下载第三方软件搭配使用。

    在这里插入图片描述

    图源:CSDN 下载自东方 IC

    如今的编程与采钻正好相反。对于采钻,想要找到那点儿有价值的钻石,你必须挖上数不清的矿土;而编程却是从价值(也就是真正的意图)出发,最终我们将其隐藏在一系列繁杂的行为背后。 ——查尔斯·西蒙尼

    1990 年 11 月 19 日,微软首次发布 Microsoft Office。这一天,微软发布了 Windows 版本的 Microsoft Office,其中包含了文档处理工具 Word、表格处理工具 Excel,以及演示文档工具 PowerPoint,被后人合称“办公三件套”。第一版的开发者为查尔斯·西蒙尼,其基础技术可追溯到施乐 PARC 的图形用户界面;查尔斯·西蒙尼是一位软件开发专家,曾担任 Microsoft Office 总设计师多年,还是变量命名规则“匈牙利命名法”的作者。

    基于某些原因,大多数 Microsoft Office 版本使用独有的界面库,没有使用操作系统的界面库;尽管 Windows 使用“服务包”,但是 Office 习惯于发布可以单独安装的升级版。但是,在 Office 2000 Service Release 1 之后,Office 现在只发布服务包。如今整个 Office 套件包含了更多工具,并且有针对各种主流操作系统的版本,而 Microsoft Office 也成为文档文件的事实标准。

    资料来源:维基百科、百度百科

    2007 年 11 月 19 日:Amazon 发布第一代 Kindle

    在这里插入图片描述

    图源:CSDN 下载自东方 IC

    Amazon Kindle 是亚马逊公司(Amazon)设计的一系列电子书阅读器,用户可以通过无线网络使用 Kindle 购买、下载和阅读电子书、报纸、杂志、博客及其他电子媒体。Kindle 这个名字是 Michael Patrick Cronan 在 Lab 126 的邀请下起的,他和伴侣 Karin Hibma 建议使用 Kindle 一词,意为点燃火焰;他们认为这个名称富含意义,暗喻着书籍和智慧所带来的兴奋。

    亚马逊于 2007 年 11 月 19 日以 399 美元的价格推出了 Kindle 第一代;当时第一批存货在五个半小时内被销售一空,直到 2008 的四月末才恢复供货,该款 Kindle 是唯一一款能通过 SD 卡槽扩展内置存储容量的型号。亚马逊未在美国以外的地区销售第一代 Kindle,虽然亚马逊曾计划在英国和其他欧洲国家销售,但是最终因为与当地无线网络运营商的合作问题而被推迟。

    亚马逊公司旗下 Lab126 开发的 Kindle 硬件平台,最早只有一种设备,现在已经发展为一个系列,大部分使用 E Ink 十六级灰度电子纸显示技术,能在最小化电源消耗的情况下提供类似纸张的阅读体验。为了保障版权权益,Kindle 内置了数码权利管理技术(Digital Rights Management);Kindle 在市场上获得较大成功,也大力拉动了电子阅读器产品,目前已经有包括索尼、Kobo、BOOX、reMarkable 等多家生产电子阅读器的品牌商在市场上互相竞争。

    资料来源:维基百科、百度百科

    2009 年 11 月 19 日:谷歌以 Chromium 的名义开源 Chrome OS

    在这里插入图片描述

    图源:CSDN 下载自东方 IC

    Chrome OS 是由 Google 设计的基于 Linux 内核的操作系统,并使用 Google Chrome 浏览器作为其主要用户界面,因此,Chrome OS 主要支持 Web 应用程序;2016 年起,Chrome OS 开始陆续兼容 Android 应用程序(可通过 Google Play 商店下载)和 Linux 应用程序。

    Google 于 2009 年 7 月宣布 Chrome OS 项目,将其视为操作系统,应用程序和用户数据都位于云端,因此 Chrome OS 主要运行 Web 应用程序,但也可以安装 Android 应用程序。Chrome OS 最初设置在上网本上使用,之后推展到笔记本(Chromebook)和台式机(Chromebox)上,在 2011 年上半年正式发表上市,Google 在 2013 年推出 Chromecast,运行精简版 Chrome OS。

    2009 年 11 月 19 日,谷歌将“Chrome OS”以“Chromium OS”之名采用开放源代码。虽然“Chrome OS”植基于 Linux 内核,不过它会使用“一种新的系统”而不会采行目前正在使用中的 Linux 标准视窗系统,比如 X 窗口系统。目前,Chrome OS 能透过 Neverware 网站所发布的 CloudReady 来在 Windows 电脑及 Mac 上实现类似 Chrome OS 的操作系统。

    【欢迎投稿】以史为镜,可以知兴替。计算机科学发展至今,有许多至关重要的事件、人物,欢迎所有朋友一起共建「历史上的今天」,投稿邮箱:tangxy@csdn.net 。

    展开全文
  • 一、Gitlab CI/CD 简介 ① GitLab GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面... Gitlab CI/CD是一个内置 GitLab 中的工具,用于通过持续方法进行软件

    一、Gitlab CI/CD 简介

    ① GitLab

    • GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私有的项目。
    • GitLab 拥有与 GitHub 类似的功能,能够浏览源代码,管理缺陷和注释。
    • GitLab 可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。

    ② GitLab CI/CD

    • Gitlab CI/CD 是一个内置在 GitLab 中的工具,用于通过持续方法进行软件开发:
      • 持续集成(Continuous Integration):频繁地(一天多次)将代码集成到主干,让产品可以快速迭代,同时还能保持高质量,它的核心措施是,代码集成到主干之前,必须通过自动化测试;
      • 持续交付(Continuous Delivery):频繁地将软件的新版本,交付给质量团队或者用户,以供评审,如果评审通过,代码就进入生产阶段,持续交付可以看作持续集成的下一步,它强调的是,不管怎么更新,软件是随时随地可以交付的;
      • 持续部署(continuous Deployment):代码通过评审以后,自动部署到生产环境,是持续部署是持续交付的下一步,持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。

    ③ GitLab Runner

    • GitLab Runner 用于执行 Gitlab CI/CD 触发的一系列作业,并将结果发送回 Gitlab。
    • GitLab Runner 可以在 Docker 容器内运行或部署到 Kubernetes 集群中。

    ④ Pipeline

    • Pipeline 中文称为流水线,是分阶段执行的构建任务。如:安装依赖、运行测试、打包、部署开发服务器、部署生产服务器等流程,合起来称为 Pipeline。

    在这里插入图片描述

    • Stage表示构建阶段,可以理解为上面所说安装依赖、运行测试等环节的流程。我们可以在一次 Pipeline 中定义多个 Stage。
    • Job 表示构建的作业(或称之为任务),表示某个 Stage 里面执行的具体任务,可以在 Stages 里面定义多个 Jobs。
    • Pipeline,Stage 和 Job 的关系如下所示:

    在这里插入图片描述

    ⑤ 整体流程

    • CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法,CI/CD 的核心概念是持续集成、持续交付和持续部署。
    • 整个流程将分为几个部分:
      • 首先开发人员在本地完成项目的开发之后,将代码推送到 Gitlab 仓库中;
      • 当代码提交到 Gitlab 仓库时,会触发 Pipeline,Gitlab Runner 会根据 .gitlab-ci.yml 配置文件运行 Pipeline 中各阶段的任务,总共定义 3 个阶段:compile,build,deploy;
      • 在 compile 阶段,Gitlab Runner 将项目编译成 jar 包,使用 MinIO 作为缓存,首次编译项目时会从 Maven 官网拉取依赖,之后会将依赖压缩后上传至 MinIo,在下一次编译时就可以直接从 MinIO 下载依赖文件;
      • 在 build 阶段,Gitlab Runner 使用在 compile 阶段编译生成的 jar 包构建 Docker 镜像,并将镜像推送至镜像仓库;
      • 在 deploy 阶段,Gitlab Runner 使用构建好 Docker 镜像在 Kubernetes 集群中部署应用。

    二、背景分析

    • 在实施业务组件化后,大部分没有组件化工具链支撑的团队一般都会遇到组件发布效率问题,如果遇到多个特性一起上线时,发布的组件数量可能达到几十个,手动发布这些组件的话,费时费力,非常影响开发体验。虽然可以通过 CI 简化单个组件的发布,只需要根据 Podfile 中的版本提交相应 tag 即可触发发布动作,但是 CI 并没有解决多个关联组件发布的前后顺序问题。如果下层组件还未发布就发布上层组件,此组件的 CI 很可能会因为缺少下层组件的某些接口而执行失败。
    • 基于 GitFlow 工作流进行日常项目的开发,项目在进入预发阶段时,关联的组件都需要拉取 release 分支,当某次发版的所有关联项目都预发测试完毕时,此次发版的负责人(通常是其中某个项目的负责人)会通知团队内部成员对组件进行封板,然后组件的负责人会去合并 release 分支到 master & develop,并且发布一个新版本,等所有组件都发布完成后,发版负责人再去更新主工程 Podfile。
    • 整个发版过程,组件负责人除了需要重复若干次以下操作,还需要知悉是否有下层组件还未发布:
    >>>> 查看组件应升级版本,更新 podspec 版本并 commit
        >>>> 合并 release 分支 ,gitflow finish release
            >>>> 打 tag 并 push 
                >>>> CI 执行完毕,组件发布完成,可能需要通知上层组件的负责人
    
    • 可以看到如果需要发布多个组件,其过程还是非常繁琐的。再单独说下发布顺序的问题,假设当前有需要发布的组件 A、B、C、D,其依赖关系如下:

    在这里插入图片描述

    • 在遵守 CocoaPods 发布规则的前提下,发布先后顺序应依次为 A、B-C、D ,其中 B 和 C 组件可同时发布,D 则需要等 B、C 都发布完成后才可以发布,也就是说只有当前组件的依赖没有包含未发布组件,此组件才可发布。
    • 我们以前的发布情况常常是这样的:下层组件 A 由于 lint 不通过,导致依赖 A 的 B、C 都 lint 失败,由于没有限制开发者对私有源仓库的 push 权限,B、C 组件的负责人这时候可能就会选择向私有源仓库强推 podspec,导致出现 lint 失败的连锁反应,越来越多的组件本身代码没问题,却因为下层组件而 lint 失败,只能选择强推 podspec。遇到这种情况,除了强调发布规则,从根本上还是要减少发版操作给组件负责人带来的工作量。
    • labor 就是为了能在一定程度上解决以上问题而创建的,在 labor 上执行发版操作时,组件负责人只需要关注 lint 的错误信息即可,剩余发布操作,包括上下层组件的发布顺序都由 labor 进行管理。

    三、效果演示

    • 以上述的 A、B、C、D 组件为例,在 labor 上添加发布并分析依赖后,可以看到组件发布页:

    在这里插入图片描述

    • 在发布页中,使用者可以查看依赖发布的组件,也可以修改发布组件的版本,labor 会在组件发布时同步到仓库的 podspec 文件中。执行自动发布后,labor 会和 GitLab 进行一系列交互。
    • 以组件 A 为例,labor 会先创建所有发布组件目标分支的 MR:

    在这里插入图片描述

    • 然后触发对应 release 分支的 pipeline:

    在这里插入图片描述

    • 这里省去的 code review 这一步骤,如果需要的话,可以在 web 上设置入口,组件负责人设置为 review 完成后,才触发 pipeline。如果 pipeline 执行成功,那么 GitLab 会自动合并 MR,如果冲突的话,需要负责人在此 MR 下解决:

    在这里插入图片描述

    • MR 合并成功后,组件会更新状态为发布中(假如组件还有依赖未发布,那么这里的状态为已合并,等待依赖发布完成,状态才为发布中):

    在这里插入图片描述

    • 然后 labor 会给组件打 tag,并且触发 tag 的 pipeline:

    在这里插入图片描述

    • 在 tag 的 pipeline 执行成功后,就视 A 组件发布成功。A 发布成功后,labor 会查看 B、C 对应 MR 状态执行后续操作:
      • MR pipeline 已经执行成功,并且对应的分支已经合并到 master (组件状态:已合并);
      • MR pipeline 由于 A 没发布,lint 失败,分支没有合并到 master(组件状态:等待中);
    • 如果是 1 状态,则直接创建 tag 发布,如果是 2 状态,则触发 MR 对应分支的 pipeline,假如此 MR 是因为 A 组件未发布导致合并失败的,那么在 A 发布后,重新触发的 MR pipeline 一般都能执行成功,当 MR 合并成功后,后续步骤与 1 一致。受益于 GitLab 分布式的 runner,可以通过 CI 同时发布多个组件。
    • 当所有组件发布完成后,labor 会根据使用者输入的组件版本,更新发版工程的 Podfile:

    在这里插入图片描述

    • 以上就是 labor 的主要工作步骤,可以看到,使用 labor 发版后,组件负责人只需要确保 MR 能顺利合并即可,不需要等待下层组件负责人发布完成的通知,也省去了繁琐的发布操作。
    • 截止到目前为止,labor 已经帮助团队执行了近 30 次自动发布,每次发布的组件个数平均在 15 个左右,节省了很多组员沟通与操作时间。

    在这里插入图片描述

    四、labor 结构与发布类型

    • labor 由如下几个服务构成:

    在这里插入图片描述

    • 其中 web 端主要专注于发版交互与组件发布数据的展示,后端负责发版信息采集、组件发布任务调度以及和 GitLab 进行通信,websocket server 主要负责实时更新 web 中组件的发布状态。server 中很多操作都是与 GitLab 进行交互,耗时较多,所以 server 中的大部分 service 都是交给 sidekiq(后台任务处理系统)执行的。
    • 依据发布性质,labor 把发布分为两种:
      • 主发布 (main deploy);
      • 子发布 (pod deploy)。
    • 这里主发布的主体是发版工程,子发布的主体是组件,其中主发布主要负责发版工程信息的获取和更新,比如依赖的分析、最后目标分支 Podfile 的更新等。主发布经过分析后,会创建若干子发布,子发布则负责组件发布的所有流程,包括组件 MR 的创建,组件 tag 的创建,发布 CI 的触发等。
    • 主发布和子发布涉及的所有状态如下:
    created:      '待分析',
    analyzing:    '分析中',
    preparing:    '准备中',
    pending:      '等待中',
    waiting:      '待发布',
    skipped:      '已忽略',
    merged:       '已合并',
    deploying:    '发布中',
    success:      '发布成功',
    failed:       '发布失败',
    canceled:     '已取消',
    
    • 使用 state_machines-activerecord 以状态机的形式对发布状态进行管理,状态发生变更之后,都会通过 websocket 同步到 web 端。
    • 分析目标工程的组件依赖是发版的第一步,对应主发布的 analyzing 状态,如下是 labor 分析步骤的序列图:

    在这里插入图片描述

    • 首先,web 向 server 端发起分析依赖请求,server 接收到请求后,使用 gitlab 向 GitLab 请求 Podfile 文件内容。由于 Podfile 可能在仓库的根目录或者 Example 文件夹下,使用 5 层深度的递归查询来获取文件路径。
    • 获取到 Podfile 路径后,再根据文件内容创建 Podfile 对象:
    # Labor::RemoteFile::Base
    def file_contents
      @file_contents ||= gitlab.file_contents(@project_id, @path, @ref)
    rescue Gitlab::Error::NotFound => error
      # self.class.name.demodulize
      # [2..-1]
      raise Labor::Error::NotFound.new("Can't find #{self.class.name.split('::').drop(2).join('')} with error #{error.message}")
    end
    
    # Labor::RemoteFile::Podfile
    def podfile
      @podfile ||= begin
        content = file_contents
        podfile = Pod::Podfile.from_ruby(Pathname.new(path), content)
        podfile
      end
    end
    
    • 生成 Podfile 对象后就可以分析发版信息,可以先过滤出需要发版的依赖:
    podfile.dependencies.select { |dependency| dependency.external? && dependency.external_source[:tag].nil?}
    
    • 然后通过同样的方式循环获取这些依赖的 podspec 文件,并且构建 Specification 对象:
    untagged_specs = Parallel.map(untagged_git_dependencies, in_threads: 5) do |dep|  
      git = dep.external_source[:git]
      ref = dep.external_source[:branch]
      component_project = gitlab.project(git)
      remote_file = Labor::RemoteFile::Specification.new(component_project.id, ref)
      remote_file.specification
    end
    
    • 这里可以利用多线程加快执行效率,不过线程数不要过多,不然容易造成 GitLab 返回数据失败。获取到所有需要发布的 spec 后,可以结合组件与其依赖、间接依赖创建发布结构,然后保存至数据库。
    • 同样以 A、B、C、D 组件为例,它们的 podspec 依赖如下:
    # podspec
    A
    
    B
    > A
    
    C
    > A
    
    D
    > B
    > C
    
    • 最终生成的发布结构如下:
    # 发布结构
    A
    
    B
    > A
    
    C
    > A
    
    D
    > A
    > B
    > C
    
    • 当 A 发布完成后,发布结构转变为:
    # 发布结构
    A
    
    B
    
    C
    
    D
    > B
    > C
    
    • B、C 组件会在需要发布的依赖清空之后,继续执行组件发布的后续操作。

    五、发布组件

    ① 组件发布核心过程

    • 组件的发布是整个服务的核心功能,顺利发布单个组件时的序列图如下:

    在这里插入图片描述

    • 上图中省略了部分和 websocket server 相关的逻辑,实际上其右边的状态发生变更时,都会进行 12、13 步骤的消息流动。
    • 如果是自动发布所有组件,而不是发布单个组件,labor 会对主发布分析出的所有组件执行发布操作,这样相关负责人就可以选择提前去 review MR 上需要合并的代码,而不是等依赖的组件发布完成。
    • 对于已知 lint 不通过,短时间无法解决错误的组件,labor 提供了手动标志组件发布成功的功能,使用者需要手动发布组件,再设置发布成功。添加这个功能主要是考虑到发版工程会接入其他业务线的组件,而我们并不想让这些组件影响发版进程。
    • 组件发布过程中,根据处理对象的不同,又可分为以下两个阶段:
      • 准备阶段(preparing ~ pending);
      • 正式发布阶段(merged ~ success)。

    ② 准备阶段

    • 首先,server 会给还未配置过的组件工程添加 webhook ,GitLab 很多任务都是放到 sidekiq 的,要想获取任务的执行信息,只能通过 webhook 让 GitLab 主动发送,所以这一步是组件能自动发布的重要前提。
    • 接着,server 会校验创建 MR 的必要条件:
      • 组件仓库必须要有 CI 配置文件,并且文件中包含发布 stage;
      • 组件仓库的 default 分支必须为 master。
    • 如果满足以上条件,我们会继续处理目标组件的 podspec 版本。labor 在分析依赖时,默认会使用 release 分支名中或者 podspec 中较高的版本号作为发布版本,如果实际发布时,组件发布版本比仓库中的 podspec 高,就需要更新 GitLab 仓库中 podspec 的 version 字段。
    • 更新 podspec 版本的代码:
    def update_podspec_content(podspec_content, version)
      require_variable_prefix = true
      version_var_name = 'version'
      variable_prefix = require_variable_prefix ? /\w\./ : //
      version_regex = /^(?<begin>[^#]*#{variable_prefix}#{version_var_name}\s*=\s*['"])(?<value>(?<major>[0-9]+)(\.(?<minor>[0-9]+))?(\.(?<patch>[0-9]+))?(?<appendix>(\.[0-9]+)*)?(-(?<prerelease>(.+)))?)(?<end>['"])/i
    
      version_match = version_regex.match(podspec_content)
      updated_podspec_content = podspec_content.gsub(version_regex, "#{version_match[:begin]}#{version}#{version_match[:end]}")
      updated_podspec_content
    end
    
    • 更新字符串后,同步至 GitLab:
    gitlab.edit_file(@project_id, @path, @ref, content, "更正 podspec 版本 #{version}".ci_skip)
    
    • 这里 commit 信息以 [ci skip] 作为前缀,以减少触发不必要的 pipeline。最后,会校验目标分支是否为 master 或者已经合并到 master ,如果是的话 server 会直接标记此发布为 merged ,等待正式发布,否则 server 会给组件仓库创建 MR ,发布进入 pending 状态,等依赖的组件都发布完成后,如果此 MR 还未合并,server 会重新触发 MR 关联的 pipeline,pipeline 运行成功,目标分支合入 master 后,再执行正式发布。

    ③ 正式发布阶段

    • 由于 tag 触发的 pipeline 包含二进制打包、源码及二进制版本发布的 stage,因此在这个阶段只需要管理 tag 及关联的 pipeline 就可以实现发布功能。这时候如果 tag 版本已经存在,GitLab 会返回创建失败,虽然 GitLab 提供了删除 tag 的功能,但还是不建议这么做的,我们会在 web 端提示发布失败,并且注明 tag 已存在,让组件负责人修改版本后重试发布此组件。
    • GitLab 创建 tag 操作是异步的,因此我们会在 webhook 中监听 tag 创建结果,创建成功之后,就可以处理 pipeline。上文提到过 以 [ci skip] 开头 commit 不会触发 pipeline,所以需要在这里做下判断,如果已经有 pipeline,那么只更新对应数据库条目,否则就需要创建新的 pipeline。

    六、更新依赖

    • 在所有组件发布完成后,我们会把变更的组件版本,同步到发版工程对应分支的 Podfile 中。受限于目前的工作流程和有限的工具链,在开发时,还是避免不了手动修改 Podfile,所以依旧使用 ruby 来编写 Podfile,没有使用 YAML 或者 JSON 格式 (pod ipc podfile/podfile-json 可查看)。
    • 过于灵活的编写方式,使得对其执行正则匹配需要以先推行编写规范为基础,因此不使用正则,而是让开发者提供 Podfile 模版,比如正常的 Podfile 为:
    # 一些 ruby 语法的配置
    target 'E' do
      pod 'A', git: 'xxxx', branch: 'release/0.1.0'
      pod 'J'
    end
    # 一些 ruby 语法的配置
    
    • 那么开发者可以在同级目录下,添加 PodfileTemplate :
    # 一些 ruby 语法的配置
    target 'E' do
    :TRIPLECCREPLACEME
    end
    # 一些 ruby 语法的配置
    
    • labor 会先获取原 Podfile,解析其依赖之后,再根据数据库中的组件及其发布版本号,更新这些依赖,然后将 PodfileTemplate 文件的 :TRIPLECCREPLACEME 替换成更新后的依赖,以生成新的 Podfile:
    # 一些 ruby 语法的配置
    target 'E' do
      pod 'A', '= 0.1.0'
      pod 'J'
    end
    # 一些 ruby 语法的配置
    
    • 当然,在工具链成熟的情况下,使用 JSON 或者 YAML 格式编写的 Podfile,更易于自动化处理,所以个人推荐前期最好不要在 Podfile 中添加过多 ruby 自定义代码,如果需要的话,可以以 cocoapods 插件的形式集成。

    七、总结

    • 由于 labor 只是个人在开发维护,所以制定流程和细节处理上可能不是非常合理,但就目前成果来看,labor 还是初步实现了发版时的组件自动化发布。本文更多的是展示了正常发布流程,实际上整个发布过程中,还是要处理挺多异常流程的。
    • 不过在发版本时才统一对需要发布的组件进行验证,容易出现解决组件 lint 错误时间过长影响发版问题,所以可能还是需要添加组件准入规则,将这部分验证往前移,比如约束主工程的分支权限,在预发提测前让开发者预先打 rc 版本,确保 rc 版本验证成功之后,再以 web 操作的方式接入主工程,预发阶段修复组件 bug 后,重新走接入流程,这样应该就能保证发版时,需要发布组件的正确性(关于 rc 版本的 lint ,可能还需要变更下 CocoaPods 查找版本的默认方式,毕竟 Semantic Versioning 优先采用正式版本)。
    展开全文
  • 这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 : Kafka是一种分布式的,分区的,复制的提交日志服务。 它提供消息传递系统的功能,但具有独特的设计。 ...
  • 本篇文章介绍如何发布矢量切片数据,并且介绍了相关矢量切片插件的安装,以及使用OpenLayers进行图层数据的调用,和样式的修改等内容。 二、矢量切片的优点 矢量切片的优点是: 1、数据客户端渲染(例如,...
  • 背景 开发时出现一些需要实时监控的任务,类似服务器挂了,执行脚本未按时执行,报错日志展示等。需要及时通知,以免造成... 3:进去之后,可以看到机器人支持Webhook协议,配置好之后,可以将业务信息推送到群里...
  • 记录一下NginxCentOS8上安装,Nginx发布多个站点,以及dotnetCoreCentOS8上安装 和 部署asp.net core应用程序为什么要记录?01 CentOs 上安装 Nginx02 编辑 nginx.conf 配置站点03 安装 dotnet core04 上传...
  • 前言 书接上文,我们开始对我们的小小聊天室进行集群化改造。...用户聊天室集群如何发消息 用户聊天室集群如何接收消息 补充知识点:STOMP 简介 功能一:向聊天室集群中的全体用户发消息——Redis的...
  • 参与翻译(4):fbm, 飞翔的猴子, Khiyuan, nesteaa 感谢这些同志们的辛勤工作,翻译的真不错,目前见到的最好的Kafka中文文章
  • ROS通信机制——发布/订阅者模型

    千次阅读 多人点赞 2021-01-28 22:21:49
    目录发布/订阅者模型(一)发布者(二)订阅者(三)综合参考资料 ROS (Robot Operating System),即机器人操作系统,是为了加快机器人的开发效率,提高机器人软件代码的复用率,用于机器人算法快速仿真验证的一个...
  • 而你如果点开了消息对话框,那对方是可以看到你已经读取了消息,因为消息,如果一一回复就很浪费时间,特别是很职位基本都不符合你的要求。因此我就打算抓一下接口,看看能不能无感知的情况下看他发的信息以及...
  • k8s 应用更新策略:灰度发布和蓝绿发布
  • ROS中自定义消息发布和订阅

    千次阅读 2018-12-25 10:14:34
    ROS中自定义消息发布和订阅建立相关文件修改CMakeList.txt和package.xml相关程序 因为需要传输目标跟踪的结果,因此需要进行自定义消息发布和订阅。 建立相关文件 首先,如果我们需要传输自定义消息的话,...
  • 如下图 右上角只有三个按钮 但是却没有上传按钮 我们知道上传按钮是为了写好的小程序发布上线和上传体验版本的,没有那怎么办呢 没有上传 主要是因为 详情 --> 基本信息 中的appid不正确 获取正确的appid ...
  • Unity发布Web之支持手机端

    千次阅读 2019-09-21 15:22:54
    相信有许多和小黑一样,遇到Unity发布WebGL后,需要在在手机浏览器上运行起来,所以我要把它分享出来,帮助大家!!!!!
  • 发布消息和发布确认一、发布消息1.固定报头2.可变报头3.有效载荷4.JSON5.客户端发送到服务端6.剩余长度二、发布确认   发布消息的单词为publish。PUBLISH 控制报文是指从客户端向服务端或者服务端向客户端传输一个...
  • 如何Google Play商店发布多个版本apk

    千次阅读 2013-07-17 14:49:22
    多种apk的支持是一个特点Google Play,它允许你发布不同的APKs为你的应用匹配不同尺寸的设备。每个APK是您的应用程序的完整和独立的版本,但它们共享同一应用程序Google Play上市,必须共享相同的包的名称,并...
  • 大纲 一.开源物联网服务器EMQ X Broker 1.搭建与启动 2.页面展示 3.版本不同 二.Springboot2搭建工程 1.配置 2.Springboot整合Mqtt ...3.简单的订阅与发布 ...预告:数据入库与实时订阅发布展示
  • 经常做网站的有时候需要让外网用户访问自己的电脑上的站点,这时候我们不仅仅要设定电脑的iis服务,还要路由器上设置转发规则,添加虚拟服务器,设置dmz主机,好吧,说的越来越乱了,还是看具体的教程吧: ...
  • NewTech:人类发布史上首张黑洞照片—1+17张高清图片讲解黑洞简史 导读 科技圈大事件:天文学家捕获首张黑洞照片。爱因斯坦曾精准语言,霍金曾发现黑洞辐射,一个令众多科学家期待已久的黑洞,终于现身了。 ...
  • Kafka下的生产消费者模式与订阅发布模式

    万次阅读 多人点赞 2017-01-21 17:27:26
    生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信。本文总结了Kafka基本概念的基础上,以“数据接入”和“事件分发”这两个场景为例,来探讨Kafka作为消息...
  • 2022 Flutter 宣布发布 Windows 正式版

    千次阅读 2022-02-04 11:21:33
    自从推出 Flutter 以来,我们一直专注于为漂亮的定制应用提供跨平台解决方案,这些应用被编译为机器代码并充分利用设备的底层图形硬件...到目前为止,我们已经看到了超出我们预期的势头,现已有近 50 万个已经发布.
  • 事业单位招聘信息在哪

    千次阅读 2019-10-14 22:35:55
    说到事业单位,很刚从校园出来的应届毕业生都很向往,但是也有很考生没接触过,想考,但是又不知道从哪里可以获取事业单位招聘的信息,那么今天就来简单了解下,事业单位招聘信息我们应该哪里找。 如何查看...
  • 发一个信息收集系统,他网站上发布一个Excel表格,然后所有就可以编辑了! 我考察了一些开发方案,最后想着让领导一个网页上上传他需要大家填写的表格,然后Excel里开发一个插件。那个插件里,可以下载...
  • 发布订阅模式的巧妙应用

    千次阅读 2019-04-01 09:26:43
    举个例子, vue 的源码中,为了让数据劫持和视图驱动解耦就是通过架设一层消息管理层实现的,而这一层消息管理层实现的原理就是发布订阅模式。再比如 Redux、Vuex 这些当下比较流行的库基本上都离不开发布订阅模式...
  • 发布组件到npm上面

    万次阅读 2020-06-19 15:03:50
    如何将自己的组件或者插件发布到npm平台上去,方便项目中使用和其他使用,本文介绍如何将一个组件发布到npm平台上去。 一、项目准备 发布到npm平台的包,是一个项目工程,跟我们平时工作中的项目类似,应该有完整...
  • NB-IoT设备定位于窄带应用,采用http协议总让感觉代价有点大,所以MQTT的应用场景更为适合,它的报文很短,订阅者/发布者的模式也非常适合一对消息通知。 MQTT基本原理不复杂,入门会比较快,看几篇文章即可,...
  • 有一个用户发的帖子是寻找队友,内容是什么记不太清了,但是过了一两天我好想又看到了这个发的寻找队友的帖子,只记得跟我前两天看到的内容不一致,于是就很好奇,这个人多次发帖怎么发的内容差距蛮大的,不是骗子...
  • 最近我们向Flink社区贡献了一个全新的Kafka连接器(https://github.com/apache/flink/pull/6703),关联...这一大特性即将会随Flink 1.7一起发布。这一特性也得到了一众Flink PMC的赞赏: 现状与问题 Apache Kafk...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 379,966
精华内容 151,986
关键字:

在哪发布消息看到人多