淦!女票问我能不能开发一个微信朋友圈、微博?

微信朋友圈,QQ空间,微博等列表展示的功能实现 该控件能够应用于内容资讯展示的功能模块中,如:腾讯和新浪微博的微博列表,微信朋友圈及其它社交类应用的好友动态展示列表等;实现了类似腾讯微博的微博列表展示功能,包含微博文本内容,表情,图片,话题和用户可点超链接等(请参见如下效果图)。该功能在实际项目开发中非常常见,除微博应用外,微信的朋友圈,陌陌、QQ空间的好友动态等也都有类似功能; 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:developer.aliyun.com/article/706808

  • 简介

  • Feed流系统特点

  • Feed流系统设计

  • 架构实践

    • 朋友圈

    • 微博

    • 头条

  • 总结


差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等。这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长。

简介

差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等。这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长。

这些产品都是Feed流类型产品,由于Feed流一般是按照时间“从上往下流动”,非常适合在移动设备端浏览,最终这一类应用就脱颖而出,迅速抢占了上一代产品的市场空间。

Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料。在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态、一条微博、一条咨询或一条短视频等,所以Feed流就是不停更新的信息单元,只要关注某些发布者就能获取到源源不断的新鲜信息,我们的用户也就可以在移动设备上逐条去浏览这些信息单元。

当前最流行的Feed流产品有微博、微信朋友圈、头条的资讯推荐、快手抖音的视频推荐等,还有一些变种,比如私信、通知等,这些系统都是Feed流系统,接下来我们会介绍如何设计一个Feed流系统架构。

Feed流系统特点

Feed流本质上是一个数据流,是将 “N个发布者的信息单元” 通过 “关注关系” 传送给 “M个接收者”。

Feed流系统是一个数据流系统,所以我们核心要看数据。从数据层面看,数据分为三类,分别是:

  • 发布者的数据:发布者产生数据,然后数据需要按照发布者组织,需要根据发布者查到所有数据,比如微博的个人页面、朋友圈的个人相册等。

  • 关注关系:系统中个体间的关系,微博中是关注,是单向流,朋友圈是好友,是双向流。不管是单向还是双向,当发布者发布一条信息时,该条信息的流动永远是单向的。

  • 接收者的数据:从不同发布者那里获取到的数据,然后通过某种顺序(一般为时间)组织在一起,比如微博的首页、朋友圈首页等。这些数据具有时间热度属性,越新的数据越有价值,越新的数据就要排在最前面。

针对这三类数据,我们可以有如下定义:

  • 存储库:存储发布者的数据,永久保存。

  • 关注表:用户关系表,永久保存。

  • 同步库:存储接收者的时间热度数据,只需要保留最近一段时间的数据即可。

设计Feed流系统时最核心的是确定清楚产品层面的定义,需要考虑的因素包括:

  • 产品用户规模:用户规模在十万、千万、十亿级时,设计难度和侧重点会不同。

  • 关注关系(单向、双写):如果是双向,那么就不会有大V,否则会有大V存在。上述是选择数据存储系统最核心的几个考虑点,除此之外,还有一些需要考虑的:

  • 如何实现Meta和Feed内容搜索?

    • 虽然Feed流系统本身可以不需要搜索,但是一个Feed流产品必须要有搜索,否则信息发现难度会加大,用户留存率会大幅下降。

  • Feed流的顺序是时间还是其他分数,比如个人的喜好程度?

    • 双向关系时由于关系很紧密,一定是按时间排序,就算一个关系很紧密的人发了一条空消息或者低价值消息,那我们也会需要关注了解的。

    • 单向关系时,那么可能就会存在大V,大V的粉丝数量理论极限就是整个系统的用户数,有一些产品会让所有用户都默认关注产品负责人,这种产品中,该负责人就是最大的大V,粉丝数就是用户规模。接下来,我们看看整个Feed流系统如何设计。

Feed流系统设计

上一节,我们提前思考了Feed流系统的几个关键点,接下来,在这一节,我们自顶向下来设计一个Feed流系统。

1. 产品定义

第一步,我们首先需要定义产品,我们要做的产品是哪一种类型,常见的类型有:

  • 微博类

  • 朋友圈类

  • 抖音类

  • 私信类

接着,再详细看一下这几类产品的异同:

类型关注关系是否有大V时效性排序
微博类单向有秒~分时间
抖音类单向/无有秒~分推荐
朋友圈类双向无秒时间
私信类双向无秒时间

上述对比中,只对比各类产品最核心、或者最根本特点,其他次要的不考虑。比如微博中互相关注后就是双向关注了,但是这个不是微博的立命之本,只是补充,无法撼动根本。

从上面表格可以看出来,主要分为两种区分:

  • 关注关系是单向还是双向:

    • 如果是单向,那么可能就会存在大V效应,同时时效性可以低一些,比如到分钟级别;

    • 如果是双向,那就是好友,好友的数量有限,那么就不会有大V,因为每个人的精力有限,他不可能主动加几千万的好友,这时候因为关系更精密,时效性要求会更高,需要都秒级别。

  • 排序是时间还是推荐:

    • 用户对feed流最容易接受的就是时间,目前大部分都是时间。

    • 但是有一些场景,是从全网数据里面根据用户的喜好给用户推荐和用户喜好度最匹配的内容,这个时候就需要用推荐了,这种情况一般也会省略掉关注了,相对于关注了全网所有用户,比如抖音、头条等。确定了产品类型后,还需要继续确定的是系统设计目标:需要支持的最大用户数是多少?十万、百万、千万还是亿?

用户数很少的时候,就比较简单,这里我们主要考虑 亿级用户 的情况,因为如果系统能支持亿级,那么其他量级也能支持。为了支持亿级规模的用户,主要子系统选型时需要考虑水平扩展能力以及一些子系统的可用性和可靠性了,因为系统大了后,任何一个子系统的不稳定都很容易波及整个系统。

2. 存储

我们先来看看最重要的存储,不管是哪种同步模式,在存储上都是一样的,我们定义用户消息的存储为存储库。存储库主要满足三个需求:

  • 可靠存储用户发送的消息,不能丢失。否则就找不到自己曾经发布到朋友圈状态了。

  • 读取某个人发布过的所有消息,比如个人主页等。

  • 数据永久保存。

所以,存储库最重要的特征就是两点:

  • 数据可靠、不丢失。

  • 由于数据要永久保存,数据会一直增长,所以要易于水平扩展。

综上,可以选为存储库的系统大概有两类:

特点分布式NoSQL关系型数据库(分库分表)
可靠性极高高
水平扩展能力线性需要改造
水平扩展速度毫秒无
常见系统Tablestore、BigtableMySQL、PostgreSQL

  • 对于可靠性,分布式NoSQL的可靠性要高于关系型数据库,这个可能有违很多人的认知。主要是关系型数据库发展很长时间了,且很成熟了,数据放在上面大家放心,而分布式NoSQL数据库发展晚,使用的并不多,不太信任。但是,分布式NoSQL需要存储的数据量更多,对数据可靠性的要求也加严格,所以一般都是存储三份,可靠性会更高。目前在一些云厂商中的关系型数据库因为采用了和分布式NoSQL类似的方式,所以可靠性也得到了大幅提高。

  • 水平扩展能力:对于分布式NoSQL数据库,数据天然是分布在多台机器上,当一台机器上的数据量增大后,可以通过自动分裂两部分,然后将其中一半的数据迁移到另一台机器上去,这样就做到了线性扩展。而关系型数据库需要在扩容时再次分库分表。

所以,结论是:

  • 如果是自建系统,且不具备分布式NoSQL数据库运维能力,且数据规模不大,那么可以使用MySQL,这样可以撑一段时间。

  • 如果是基于云服务,那么就用分布式NoSQL,比如Tablestore或Bigtable。

  • 如果数据规模很大,那么也要用分布式NoSQL,否则就是走上一条不归路。

如果使用Tablestore,那么存储库表设计结构如下:

主键列第一列主键第二列主键属性列属性列
列名user_idmessage_idcontentother
解释消息发送者用户ID消息顺序ID,可以使用timestamp。内容其他内容

到此,我们确定了存储库的选型,那么系统架构的轮廓有了:

3. 同步

系统规模和产品类型,以及存储系统确定后,我们可以确定同步方式,常见的方式有三种:

  • 推模式(也叫写扩散):和名字一样,就是一种推的方式,发送者发送了一个消息后,立即将这个消息推送给接收者,但是接收者此时不一定在线,那么就需要有一个地方存储这个数据,这个存储的地方我们称为:同步库。推模式也叫写扩散的原因是,一个消息需要发送个多个粉丝,那么这条消息就会复制多份,写放大,所以也叫写扩散。这种模式下,对同步库的要求就是写入能力极强和稳定。读取的时候因为消息已经发到接收者的收件箱了,只需要读一次自己的收件箱即可,读请求的量极小,所以对读的QPS需求不大。归纳下,推模式中对同步库的要求只有一个:写入能力强。

  • 拉模式(也叫读扩散):这种是一种拉的方式,发送者发送了一条消息后,这条消息不会立即推送给粉丝,而是写入自己的发件箱,当粉丝上线后再去自己关注者的发件箱里面去读取,一条消息的写入只有一次,但是读取最多会和粉丝数一样,读会放大,所以也叫读扩散。拉模式的读写比例刚好和写扩散相反,那么对系统的要求是:读取能力强。另外这里还有一个误区,很多人在最开始设计feed流系统时,首先想到的是拉模式,因为这种和用户的使用体感是一样的,但是在系统设计上这种方式有不少痛点,最大的是每个粉丝需要记录自己上次读到了关注者的哪条消息,如果有1000个关注者,那么这个人需要记录1000个位置信息,这个量和关注量成正比的,远比用户数要大的多,这里要特别注意,虽然在产品前期数据量少的时候这种方式可以应付,但是量大了后就会事倍功半,得不偿失,切记切记。

  • 推拉结合模式:推模式在单向关系中,因为存在大V,那么一条消息可能会扩散几百万次,但是这些用户中可能有一半多是僵尸,永远不会上线,那么就存在资源浪费。而拉模式下,在系统架构上会很复杂,同时需要记录的位置信息是天量,不好解决,尤其是用户量多了后会成为第一个故障点。基于此,所以有了推拉结合模式,大部分用户的消息都是写扩散,只有大V是读扩散,这样既控制了资源浪费,又减少了系统设计复杂度。但是整体设计复杂度还是要比推模式复杂。

用图表对比:

类型推模式拉模式推拉结合模式
写放大高无中
读放大无高中
用户读取延时毫秒秒秒
读写比例1:9999:1~50:50
系统要求写能力强读能力强读写都适中
常见系统Tablestore、Bigtable等LSM架构的分布式NoSQLRedis、memcache等缓存系统或搜索系统(推荐排序场景)两者结合
架构复杂度简单复杂更复杂

介绍完同步模式中所有场景和模式后,我们归纳下:

  • 如果产品中是双向关系,那么就采用推模式。

  • 如果产品中是单向关系,且用户数少于1000万,那么也采用推模式,足够了。

  • 如果产品是单向关系,单用户数大于1000万,那么采用推拉结合模式,这时候可以从推模式演进过来,不需要额外重新推翻重做。

  • 永远不要只用拉模式。

  • 如果是一个初创企业,先用推模式,快速把系统设计出来,然后让产品去验证、迭代,等客户数大幅上涨到1000万后,再考虑升级为推拉集合模式。

  • 如果是按推荐排序,那么是另外的考虑了,架构会完全不一样,这个后面专门文章介绍。

如果选择了Tablestore,那么同步库表设计结构如下:

主键列第一列主键第二列主键属性列属性列属性列
列名user_idsequence_idsender_idmessage_idother
解释消息接收者用户ID消息顺序ID,可以使用timestamp + send_user_id,也可以直接使用Tablestore的自增列。发送者的用户IDstore_table中的message_id列的值,也就是消息ID。通过sender_id和message_id可以到store_table中查询到消息内容其他内容,同步库中不需要包括消息内容。

确定了同步库的架构如下:

4. 元数据

前面介绍了同步和存储后,整个Feed流系统的基础功能完成了,但是对于一个完整Feed流产品而言,还缺元数据部分,接下来,我们看元数据如何处理:

Feed流系统中的元数据主要包括:

  • 用户详情和列表。

  • 关注或好友关系。

  • 推送session池。

我们接下来逐一来看。

4.1 用户详情和列表

主要是用户的详情,包括用户的各种自定义属性和系统附加的属性,这部分的要求只需要根据用户ID查询到就可以了。

可以采用的分布式NoSQL系统或者关系型数据库都可以。

如果使用NoSQL数据库Tablestore,那么用户详情表设计结构如下:

主键顺序第一列主键属性列-1属性列-2......
字段名user_idnick_namegenderother
备注主键列,用于唯一确定一个用户用户昵称,用户自定义属性用户性别,用户自定义属性其他属性,包括用户自定义属性列和系统附加属性列。Tablestore是FreeSchema类型的,可以随时在任何一行增加新列而不影响原有数据。

4.2 关注或好友关系

这部分是存储关系,查询的时候需要支持查询关注列表或者粉丝列表,或者直接好友列表,这里就需要根据多个属性列查询需要索引能力,这里,存储系统也可以采用两类,关系型、分布式NoSQL数据库。

  • 如果已经有了关系型数据库了,且数据量较少,则选择关系型数据库,比如MySQL等。

  • 如果数据量比较大,这个时候就有两种选择:

  1. 使用具有索引的系统,比如云上的Tablestore,更简单,吞吐更高,扩容能力也一并解决了。

    1. 需要分布式事务,可以采用支持分布式事务的系统,比如分布式关系型数据库。

    如果使用Tablestore,那么关注关系表设计结构如下:

    Table:user_relation_table

    主键顺序第一列主键第一列主键属性列属性列
    Table字段名user_idfollow_user_idtimestampother
    备注用户ID粉丝用户ID关注时间其他属性列

    多元索引的索引结构:

    Table字段名user_idfollow_user_idtimestamp
    是否Index是是是
    是否enableSortAndAgg是是是
    是否store是是是

    查询的时候:

    • 如果需要查询某个人的粉丝列表:使用TermQuery查询固定user_id,且按照timestamp排序。

    • 如果需要查询某个人的关注列表:使用TermQuery查询固定follow_user_id,且按照timestamp排序。

    • 当前数据写入Table后,需要5~10秒钟延迟后会在多元索引中查询到,未来会优化到2秒以内。

    除了使用多元索引外,还可以使用GlobalIndex。

    4.3 推送session池

    思考一个问题,发送者将消息发送后,接收者如何知道自己有新消息来了?客户端周期性去刷新?如果是这样子,那么系统的读请求压力会随着客户端增长而增长,这时候就会有一个风险,比如平时的设备在线率是20%~30%,突然某天平台爆发了一个热点消息,大量休眠设备登陆,这个时候就会出现“查询风暴”,一下子就把系统打垮了,所有的用户都不能用了。

    解决这个问题的一个思路是,在服务端维护一个推送session池,这个里面记录哪些用户在线,然后当用户A发送了一条消息给用户B后,服务端在写入存储库和同步库后,再通知一下session池中的用户B的session,告诉他:你有新消息了。然后session-B再去读消息,然后有消息后将消息推送给客户端。或者有消息后给客户端推送一下有消息了,客户端再去拉。

    这个session池使用在同步中,但是本质还是一个元数据,一般只需要存在于内存中即可,但是考虑到failover情况,那就需要持久化,这部分数据由于只需要指定单Key查询,用分布式NoSQL或关系型数据库都可以,一般复用当前的系统即可。

    如果使用Tablestore,那么session表设计结构如下:

    主键列顺序第一列主键第二列主键属性列
    列名user_iddevice_idlast_sequence_id
    备注接收者用户ID设备ID,同一个用户可能会有多个设备,不同设备的读取位置可能不一致,所以这里需要一个设备ID。如果不需要支持多终端,则这一列可以省略。该接收者已经推送给客户端的最新的顺序ID

    5. 评论

    除了私信类型外,其他的feed流类型中,都有评论功能,评论的属性和存储库差不多,但是多了一层关系:被评论的消息,所以只要将评论按照被被评论消息分组组织即可,然后查询时也是一个范围查询就行。这种查询方式很简单,用不到关系型数据库中复杂的事务、join等功能,很适合用分布式NoSQL数据库来存储。

    所以,一般的选择方式就是:

    • 如果系统中已经有了分布式NoSQL数据库,比如Tablestore、Bigtable等,那么直接用这些即可。

    • 如果没有上述系统,那么如果有MySQL等关系型数据库,那就选关系型数据库即可。

    • 如果选择了Tablestore,那么“评论表”设计结构如下:

    主键列顺序第一列主键第二列主键属性列属性列属性列
    字段名message_idcomment_idcomment_contentreply_toother
    备注微博ID或朋友圈ID等消息的ID这一条评论的ID评论内容回复给哪个用户其他

    如果需要搜索评论内容,那么对这张表建立多元索引即可。

    6. 赞

    最近几年,“赞”或“like”功能很流行,赞功能的实现和评论类似,只是比评论少了一个内容,所以选择方式和评论一样。

    如果选择了Tablestore,那么“赞表”设计结构同评论表,这里就不再赘述了。

    系统架构中加了元数据系统后的架构如下:

    7. 搜索

    到此,我们已经介绍完了Feed流系统的主题架构,Feed流系统算是完成了。但是Feed流产品上还未结束,对于所有的feed流产品都需要有搜索能力,比如下面场景:

    • 微博中的搜索用户。

    • 搜索微博内容。

    • 微信中搜索好友等。

    这些内容搜索只需要字符匹配到即可,不需要非常复杂的相关性算法,所以只需要有能支持分词的检索功能即可,所以一般有两种做法:

    使用搜索引擎,将存储库的内容和用户信息表内容推送给搜索系统,搜索的时候直接访问搜索系统。使用具备全文检索能力的数据库,比如最新版的MySQL、MongoDB或者Tablestore。

    所以,选择的原则如下:

    • 如果存储库使用了MySQL或者Tablestore,那么直接选择这两个系统就可以了。

    • 如果整个系统都没使用MySQL、Tablestore,且已经使用了搜索系统,那么可以直接复用搜索系统,其他场景都不应该再额外加一个搜索系统进来,徒添复杂度。

    如果使用Tablestore,那么只需要在相应表上建立多元索引即可:

    • 如果需要对用户名支持搜索,那么需要对user_table建立多元索引,其中的nick_name需要是Text类型,且单字分词。

    • 如果需要对Feed流内容支持搜索,那么需要对存储库表:store_table建立多元索引,这样就能直接对Feed流内容进行各种复杂查询了,包括多条件筛选、全文检索等。

    系统架构中加了搜索功能后的架构如下:

    8. 排序

    目前的Feed流系统中的排序方式有两种,一种是时间,一种是分数。

    我们常用的微博、朋友圈、私信这些都是时间线类型的,因为这些产品定义中,需要我们主动关注某些人后才会看到这些人发表的内容,这个时候,最重要的是实时性,而不是发布质量,就算关注人发布了一条垃圾信息,我们也会被动看到。这种类型的产品适用于按照时间线排序。这一篇我们介绍的架构都是基于时间类型的。

    另外一种是不需要关注任何人,我们能看到的都是系统希望我们看到的,系统在后台会分析我们的每个人的爱好,然后给每个人推送差异化的、各自喜欢的内容,这一种的架构和基于时间的完全不一样,我们在后续的推荐类型中专门介绍。

    9. 删除Feed内容

    在Feed流应用中有一个问题,就是如果用户删除了之前发表的内容,系统该如何处理?因为系统里面有写扩散,那么删除的时候是不是也要写扩散一遍?这样的话,删除就不及时了,很难应对法律法规要求的快速删除。

    针对这个问题,我们在之前设计的时候,同步表中只有消息ID,没有消息内容,在用户读取的时候需要到存储库中去读消息内容,那么我们可以直接删除存储库中的这一条消息,这样用户读取的时候使用消息ID是读不到数据的,也就相当于删除的内容,而且删除速度会很快。除了直接删除外,另外一种办法是逻辑删除,对于删除的feed内容,只做标记,当查询到带有标记的数据时就认为删除了。

    10. 更新Feed内容

    更新和删除Feed处理逻辑一样,如果使用了支持多版本的存储系统,比如Tablestore,那么也可以支持编辑版本,和现在的微博一样。

    11. 总结

    上面介绍了不同子功能的特点和系统要求,能满足需求的系统主要有两类,一类是阿里云的Tablestore单系统,一类是开源组件组成的组合系统。

    • 开源组件组成的组合系统:包括MySQL、Redis、HBase等,这些系统单个都不能解决Feed流系统中遇到的问题,需要组合在一起,各司其职才能完成一个Feed流系统,适用于热衷开源系统,人多且喜欢运维操作的团队。

    • Tablestore单系统:只使用Tablestore单个系统就能解决上述的所有问题,这时候肯定有人要问?你是不是在吹牛?这里不是吹牛,Tablestore在三年前就已经开始重视Feed流类型业务,之前也发表过多篇文章介绍,功能上也在专门为Feed流系统特别定制设计,所以到今天,只使用Tablestore一款产品,是可以满足上述需求的。选择Tablestore做Feed流系统的用户具有以下一些特征:

      • 产品设计目标规模大,千万级或亿级。

      • 不喜欢运维,喜欢专注于开发。

      • 高效率团队,希望尽快将产品实现落地。

      • 希望一劳永逸,未来系统随着用户规模增长可以自动扩容。

      • 希望能按量付费,用户少的时候费用低,等用户增长起来后费用在跟随用户数增长。如果具有上述四个特征的任何一个,那么都是适合于用Tablestore。

    架构实践

    上面我们介绍了Feed流系统的设计理论,具体到不同的类型中,会有不同的侧重点,下面会逐一介绍。

    朋友圈

    朋友圈是一种典型的Feed流系统,关系是双写关系,关系有上限,排序按照时间,如果有个人持续产生垃圾内容,那就只能屏蔽掉TA,这一种类型就是典型的写扩散模型。

    微博

    微博也是一种非常典型的Feed流系统,但不同于朋友圈,关系是单向的,那么也就会产生大V,这个时候就需要读写扩散模式,用读扩散解决大V问题。同时,微博也是主动关注类型的产品,所以排序也只能是时间,如果按照推荐排序,那么效果就会比较差。

    头条

    头条是最近几年快速崛起的一款应用,在原有微博的Feed流系统上产生了进化,用户不需要主动关注其他人,只要初始浏览一些内容后,系统就会自动判断出你的喜好,然后后面再根据你的喜好给你推荐你可能会喜好的内容,训练时间长了后,推送的内容都会是你最喜欢看的。

    私信

    私信也算是一种简单的Feed流系统,或者也可以认为是一种变相的IM,都是单对单的,没有群。

    总结

    上面我们介绍了Feed流系统的整体框架,主要是产品定义、同步、存储、元数据、评论、赞、排序和搜索等内容。



    欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

    已在知识星球更新源码解析如下:

    最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

    提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

    获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

    兄弟,艿一口,点个赞!????

攻防世界 Crypto 新手练习区 1-12 全详解 本篇是攻防世界 Crypto 新手练习区的全解 阅读详情

相关推荐

模糊高清修复真王炸!ComfyUI-SeedVR2-Kontext(画质修复+P图)本地部署教程

SeedVR2_comfyUI 是由字节跳动 Seed 实验室与南洋理工大学 S-Lab 联合开源的,专为 ComfyUI 用户开发的插件版本,官方项目名为。它主打,在图像超分上表现尤其亮眼,被多位实测者称为“目前模糊图像修复最强模型“。SeedVR2 在图像超分任务中表现突出,尤其擅长恢复模糊图像的细节,被称为“模糊高清修复真王炸”。特别的,也适合用于文字密集图像(如截图、扫描文档、老照片字幕)修复。模型通过对抗训练 + 特征匹配损失提升细节真实感,理论上对文字边缘锐化也有帮助。

SJJS_1的博客 2688

Java开发微信朋友圈PC版系统(架构2.0+分布式中间件)

继“Java开发微信朋友圈PC版系统-架构1.0”之后,debug这段时间日撸夜撸,终于赶在春节放假前给诸位带来了这一系统的架构2.0版本,特此分享给诸位进行学习,以掌握、巩固更多的技术栈以及项目和产品开发经验,同时也为即将到来的金三银四跳槽季做准备! 言归正传,下面仍然以问答的方式介绍下本门课程的相关内容! (1)问题一:这是一门什么样的课程? 很明显,本门课程是建立在架构1.0,即 第1门课程 的基础上发布的,包含了架构1.0的内容,即它仍然是一门项目、产品实战课,基于Spring Boot2.X + 分布式中间件开发的一款类似“新浪微博”、“QQ空间”、“微信朋友圈”PC版的互联网社交软件,包含完整的门户网前端 以及 后台系统管理端,可以说是一套相当完整的系统! (2)问题二:架构2.0融入了哪些新技术以及各自有什么作用? 本课程对应着系统架构2.0,即第2阶段,主要目标:基于架构1.0,优化系统的整体性能,实现一个真正的互联网社交产品;其中,可以学习到的技术干货非常多,包括:系统架构设计、Spring Boot2.X、缓存Redis、多线程并发编程、消息中间件RabbitMQ、全文搜索引擎Elastic Search、前后端消息实时通知WebSocket、分布式任务调度中间件Elastic Job、Http Restful编程、Http通信OKHttp3、分布式全局唯一ID、雪花算法SnowFlake、注册中心ZooKeeper、Shiro+Redis 集群Session共享、敏感词自动过滤、Java8 等等; A.  基于Elastic Search实现首页列表数据的初始化加载、首页全文检索;B.  基于缓存Redis缓存首页朋友圈“是否已点赞、收藏、关注、评论、转发”等统计数据;整合Shiro实现集群部署模式下Session共享;C.  多线程并发编程并发处理系统产生的废弃图片、文件数据;D.  基于Elastic Job切片作业调度分布式多线程清理系统产生的废弃图片;E.  基于RabbitMQ解耦同步调用的服务模块,实现服务模块之间异步通信;F.  基于WebSocket实现系统后端 与 首页前端 当前登录用户实时消息通知;G.  基于OKHttp3、Restful风格的Rest API实现ES文档、分词数据存储与检索;H.  分布式全局唯一ID 雪花算法SnowFlake实现朋友圈图片的唯一命名;I.  ZooKeeper充当Elastic Job创建的系统作业的注册中心;J.  为塑造一个健康的网络环境,对用户发的朋友圈、评论、回复内容进行敏感词过滤;K.  大量优雅的Java8  Lambda编程、Stream编程;  (3)问题三:系统运行起来有效果图看吗?

Android逆向分析

Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。Android应用 Java编写的,利用Android SDK编译代码,并并且把所有的数据和资源文件打包成一个APK(Android Package)文件这是一个后缀名为.apk的压缩文件,apk文件中包含了一个Anddroid应用程序的所有内容,是Android平台用于安装应用程序的文件。

qq_51598534的博客 6294

Java开发微信朋友圈PC版系统(架构1.0+Spring Boot2.X实战)

2021已然来临,在此之际debug抽空撸了一套 类似“QQ空间”、“新浪微博”、“微信朋友圈”PC版的互联网社交软件系统,并将其录制成了视频,特此分享给诸位进行学习,以掌握、巩固更多的技术栈和项目、产品开发经验! 言归正常,下面以问答的方式重点介绍下本门课程/系统的相关内容!  (1)问题一:这是一门什么样的课程? 本门课程是一门项目实战课程,基于Spring Boot2.X开发的一款类似“新浪微博”、“QQ空间”、“微信朋友圈”PC版的互联网社交软件,包含完整的门户网前端 以及 后台系统管理端,可以说是一套相当完整的系统!,大纲图如下所示:  而整个系统的系统架构设计如下图所示(注意:该图表示的是整个系统架构将经历N个阶段的演进,目前初定是4个阶段的演进,分别是架构1.0、2.0、3.0、4.0 !)   (2)问题二:可以学到哪些技术? 本课程对应着系统架构1.0,即第一阶段,主要的目标在于实现一个完整的系统,可以学到的技术还是比较多的:Spring Boot2.X、Java基础、Java8、JUC、NIO、微服务、分布式、系统架构设计、SpringMVC、MySQL、Lucene、多线程、并发编程、Bootstrap、HTML5、CSS3、JQuery、AdminLTE、VUE、LayUI相关组件等等 从架构2.0,即第二阶段的内容(对应第2门课程)开始将慢慢融入更多地技术栈,用以解决更多的业务、性能和服务拆分等问题!本门课程是后续其他阶段对应的课程的奠基,因此如果想要学习后续架构2.0、3.0、4.0的演进,则必须得先学习本门课程!   (3)问题三:系统运行起来有效果图看吗?   (4)问题四:学习本课程之前有什么要求? 要求的话,主要有两点,一是要有一定的Spring Boot、MySQL 以及 Web开发基础;二是最好学过Debug录制的 “企业权限管理平台(Spring Boot2.X+Shiro+Vue)”项目实战课程,因为本门课程“仿微博系统全程实战”的后台管理正是基于 “企业权限管理平台”项目二次开发的,因此建议最好先撸了那个课程再来学习本门课程! 友情提示:“企业权限管理平台(Spring Boot2.X+Shiro+Vue)”项目实战课程的购买学习地址:https://edu.youkuaiyun.com/course/detail/25646  (TIP:可以考虑购买组合套餐课程哦,更加实惠!!!)  岁末将至,人心浮躁 当此之际,应当沉下心,摒弃浮躁 要相信技术是第一生产力 相信技术改变生活、技术成就梦想! 特别是那些即将在过完年准备跳槽面试的小伙伴,本系统将可以为你增添几分亮点!!!  寄语:购买本课程的小伙伴将可获得本课程完整的视频教程、系统源代码数据库、课件PPT以及其他相关的工具跟资料,还可以进专属技术交流群交流技术!!!

红日-VulnStack靶场-ATT&CK(二):从Weblogic漏洞到域控渗透实战

本文详细解析了红日安全团队VulnStack靶场中从Weblogic漏洞到域控渗透的完整攻击链。通过实战演示Weblogic反序列化漏洞利用、Cobalt Strike持久化控制、域内信息收集及PsExec横向移动等关键技术,复现了企业内网渗透的典型场景,并提供了防御建议。

tgb3456789的博客 937

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

如何设计一个超级牛逼的 Feed 流系统

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 16 分钟。来自:https://yq.aliyun.com/articles/706808?utm_content...

良月柒 1805

攻防实战之Confluence后利用

这边管理员密码是密文加密在数据库中,解不开,因此解决的思路是将管理员用户密码修改为已知明文密码的密文(这边不能直接在数据库中添加字段,关系型数据库在单表中添加一条字段可能会出现问题),登录上后台以后,添加用户并加入管理员组,最后将管理员密码还原。Confluence的后利用主要问题在于在Linux中搭建时,默认是Confluence用户权限,如下图所示,而confluence在linux中是没有写权限的,这也就是为什么有些人发现可以执行命令但是shell写不进去。至此admin的密码被改为了123123。

weixin_39251927的博客 2716

微信朋友圈设计原理

转自:http://www.woshipm.com/pd/2701264.html 当你一秒钟拍了张自拍,一个小时修了下图,然后打开朋友圈,点击发送的那一刻,后台到底有多少工作在进行着? 我们太习以为常,没有意识到这背后还会有多复杂的逻辑。为什么每天几十亿量级的朋友圈发布量,都没有让微信崩溃过? 我看了朋友圈负责人陈明的演讲,他分享了微信的架构,数据结构设计等。演讲很好看,很实在,但有的时候...

学无止境 8478

optee技术简介

OP-TEE(Open Portable Trusted Execution Environment)是一种开源的可信执行环境(TEE),专为ARM TrustZone架构设计。TEE是一种独立的执行环境,运行在主操作系统之外,为敏感任务提供安全的计算空间,如加密、身份验证、密钥管理等。

baron-周贺贺-代码改变世界ctw 1279

YOLO26优化:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 370

浅谈微信朋友圈的架构设计

微信朋友圈是一种社交媒体应用,主要功能是让用户分享图片、视频和文字等内容,并与好友互动。

Java技术攻略的博客 2600

【Halcon-2D测量】add_metrology_object_rectangle2_measure 函数功能(用于向2D计量模型中添加旋转矩形(rectangle2类型)计量对象)

HALCON算子add_metrology_object_rectangle2_measure解析摘要 该算子是HALCON 2D计量模块的核心算子,用于添加旋转矩形计量对象并配置测量参数。主要功能包括:定义旋转矩形几何轮廓(中心坐标、主轴角度、长短半长);生成垂直于矩形边界的测量区域;设置边缘提取预处理参数(高斯平滑、振幅阈值)。关键注意事项:MeasureLength1必须小于矩形长短半长;角度参数Phi需使用弧度单位;多线程需同步模型句柄。该算子适用于方形螺母、PCB板边框等矩形零件的精密测量,需与a

weixin_45590420的博客 1225

vue分享至qq空间,新浪微博,微信朋友圈及微信好友

vue分享至qq空间,新浪微博,微信朋友圈及微信好友 本博客主要针对pc网页版分享,移动端相似之处不做参考 关于分享,对于分享到qq空间、好友及新浪微博比较简单,给一个点击事件调用一下官方接口就可以了,自己绑定一些标题、链接、图片内容就可以了 分享到qq空间及好友 qq空间: https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?u...

weixin_44868881的博客 5539

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

不能编辑_为什么微信朋友圈发布后只能删除,不能重新编辑?

在回答这个问题之间我们先看看目前微信能做到什么。目前,我们在ios上打开最新版的微信,进入朋友圈,删除自己刚刚发布的朋友圈后,会出现重新编辑的提示,点击即可对刚删除的朋友圈进重新编辑。但这个功能有时效性,超过2分钟将不能重新编辑。微信的这一功能可以满足,用户在刚发布朋友圈后,觉得朋友圈内容不合适,想重新编辑的需要。那么为什么微信不支持对发布已久的朋友圈进行再次编辑呢?通过这个问题又可以引申出,为什...

weixin_36031047的博客 5127

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

h5怎么做分享到QQ 、朋友圈、微信 、微博等功能

微信已经成为我们日常聊天联系基本的必备工具,所以小菜我首先介绍一下如何调用微信的分享功能。其实除了可以在微信上分享到朋友圈和发送给好友,微信的分享接口还提供了分享到QQ和分享到腾讯微博等,就是在页面的config接口注入权限验证配置好就ok! 类似于“分享到朋友圈”按钮点击状态及自定义分享内容接口,我们调用“分享到QQ”和“分享到腾讯微博”按钮点击状态及自定义分享内容接口...

weixin_30929295的博客 2325

微信又放大招!朋友圈可以发话题标签了,越来越像微博?

点击上方 "程序员小乐"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!关注订阅号「程序员小乐」,收看更多精彩内容每日英文Do a plain and neat ...

程序员小乐 2095

微信网页开发终极指南:5分钟掌握wechat.js实现朋友圈分享功能

在移动互联网时代,微信已经成为连接用户与内容的重要桥梁。对于开发者来说,如何在微信环境中优雅地实现网页分享功能是一个常见的挑战。wechat.js作为一个专注于微信相关JS操作的实用库,能够帮助开发者轻松实现微信分享、网络状态检测和菜单控制等功能,让你的网页内容在社交平台获得更多曝光机会。 ## 🌟 为什么选择wechat.js? 微信生态开发常常面临API复杂、兼容性差的问题。wechat

gitblog_00214的博客 380

wechat.js快速上手指南:5分钟实现微信朋友圈分享功能

wechat.js是一个专注于微信相关JS操作的实用库,能够帮助开发者轻松实现微信分享、网络状态检测和菜单控制等功能。本文将带你快速掌握如何使用wechat.js在5分钟内实现微信朋友圈分享功能,让你的网页内容在社交平台获得更多曝光。 ## 📋 准备工作:安装wechat.js 要开始使用wechat.js,首先需要通过bower进行安装。打开终端,执行以下命令: ```bash $ bo

gitblog_00803的博客 484

如何发一条空白的朋友圈

所谓空白的朋友圈就是一条看起来没有文字的朋友圈,因为发朋友圈的时候不输入文字是没法发送的。不可见字符是有文字内容的,只是人的肉眼看不见,所以相当于空白。 不可见字符 不可见字符就是零宽空格,见维基百科解释https://zh.wikipedia.org/wiki/%E9%9B%B6%E5%AE%BD%E7%A9%BA%E6%A0%BC : 零宽空格(zero-width space, ZWSP)...

sushengbuhuo的博客 5万+

分享到微信列表、朋友圈、微信小程序,分享到qq、qq空间、分享qq小程序,分享到微博

微信分享,分享小程序 // 检测是否安装微信 if (![WXApi isWXAppInstalled] || ![WXApi isWXAppSupportApi]) { return; } SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; req.bText = NO; ...

weixin_45248288的博客 3164

前端做微信好友分享_基于js实现微信发送好友如何分享到朋友圈、微博

微信浏览器内置了javascript私有对象WeixinJSBridge,可以实现发送给朋友、分享到朋友圈、分享到微博等功能。var imgUrl = "图片地址";var lineLink = "当前网址";var descContent = "描述";var shareTitle = '标题';var appid = '';function shareFriend() {WeixinJSBri...

weixin_39836898的博客 353

用sharesdk第三方等陆或分享到QQ空间,qq好友,微信,朋友圈,新浪微博,腾讯微博等

公司最近不景气,辞职后的日子刚开始还挺嗨皮,过两天闲的蛋都碎了,都四月份了,还是领到毕业证在找吧。。。。。。     不扯淡了,项目中经常有第三方等陆或者分享的功能,以下是我用sharesdk实现的步骤。。     1 使用第三方前,导入MainLibs/libs中相应的包,res中的drawble中的图片必须导入到工程中,values中的String.xml中的条目选择自己用到的复制到

ruanjianyujian的专栏 6173

php分享朋友圈源码,php微信分享到朋友圈、QQ、朋友、微博

本文实例为大家分享了php微信分享到朋友圈、QQ、朋友、微博的具体代码,供大家参考,具体内容如下前台代码wx.config({debug: false,appId: "{$signPackage['appId']}",timestamp: "{$signPackage['timestamp']}",nonceStr: "{$signPackage['nonceStr']}",signature: ...

weixin_29540599的博客 692

微信开发必备:TypeScript-WeChat-Starter类型定义文件wechat.d.ts全解析

TypeScript-WeChat-Starter是一个专为微信开发打造的TypeScript模板项目,它提供了完整的微信JSSDK类型定义文件wechat.d.ts,帮助开发者在微信生态中构建类型安全的应用程序。本文将深入解析这个关键文件的结构与功能,让你轻松掌握微信开发的类型定义使用技巧。 ## 为什么需要wechat.d.ts类型定义? 在TypeScript开发中,类型定义文件(.d.

gitblog_00168的博客 919

wechat.js终极指南:如何在微信网页开发中轻松实现分享与交互功能

微信网页开发总是让你头疼吗?面对微信JSSDK复杂的API和不统一的接口,很多开发者感到无从下手。wechat.js正是为解决这一痛点而生的轻量级JavaScript库,它封装了微信原生JSSDK接口,为你提供简洁易用的API,让你在微信网页开发中游刃有余。无论你是新手还是经验丰富的开发者,掌握wechat.js都能让你的开发效率提升数倍。 ## 📱 为什么微信网页开发需要wechat.js?

gitblog_00100的博客 823

php 微信转发朋友圈,php微信分享到朋友圈、QQ、朋友、微博

本文实例为大家分享了php微信分享到朋友圈、QQ、朋友、微博的具体代码,供大家参考,具体内容如下前台代码wx.config({debug: false,appId: "{$signPackage['appId']}",timestamp: "{$signPackage['timestamp']}",nonceStr: "{$signPackage['nonceStr']}",signature: ...

weixin_30548481的博客 403
上一篇: 不想用 Swagger?可以试试这个神器!
下一篇: 你的微服务网关还只在用负载均衡吗?
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值