首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

啊,业务层是否也需要服务化?

什么时候抽象数据服务层》中的观点是: 当手写代码从DB中获取数据,成为通用痛点的时候,就应该抽象出DAO层,简化数据获取过程,提高数据获取效率,向上游屏蔽底层的复杂性 当业务越来越复杂,垂直拆分的系统越来越多...首先调用商业基础service,获取商业广告帖子数据,用于顶部置顶/精准的广告帖子展示 再调用搜索基础service,获取自然搜索帖子数据,用于中部自然搜索帖子展示 再调用推荐基础service,获取推荐帖子数据...,用于底部推荐帖子展示 再调用用户基础service,获取用户数据,用于右侧用户信息展示 … 如果只有一个列表页这么写还行,但如果有招聘、房产、二手、二手车、黄页…等多个大部分是共性数据,少部分是个性数据的列表页...service提供的RPC接口,分别获取数据,底层数据获取的复杂性,全都屏蔽在了此处 是不是连接关系也看起来更清晰?...这样的好处是: 复杂的从基础服务获取数据代码,只有在通用业务service处写了一次,没有代码拷贝 底层基础数据service接口发生变化,只有通用业务service一处需要升级修改 如果有bug,不管是底层基础数据

1.3K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Laravel利用redis和定时任务实现活跃用户统计

    最近在Summer的《Laravel教程-Web开发实战进阶》学到很多东西,以前只会看文档,大概了解Laravel的内容而在实际运用中确不知道该怎样做,碰到一个需求不会立马联想到“这个东西可以用...实现...linux和redis 以及laravel的任务调度 活跃用户算法 我们规定系统每个小时,统计最近7天用户所发表的帖子数和评论数。...用户发布帖子+4分 用户发布评论+1分 最后计算所有人的得分进行倒序排序 取前八个用户显示在主页活跃用户栏 类似 需求已经明确我们开始编写代码,不过在编写代码之前我们需要.env中指定缓存驱动为redis...// 否则运行匿名函数中的代码来取出活跃用户数据,返回的同时做了缓存。...中 我们要通过定时任务来实现用户活跃统计,所以我们通过命令执行ActiveUserHelper中的逻辑。

    94420

    程序猿必读-防范CSRF跨站请求伪造

    CSRF攻击最早在2001年被发现,由于它的请求是从用户的IP地址发起的,因此在服务器上的web日志中可能无法检测到是否受到了CSRF攻击,正是由于它的这种隐蔽性,很长时间以来都没有被公开的报告出来,直到...于是在管理员不知情的情况下,一个赋予用户管理员权限的操作已经悄悄的以他的身份执行了。这时候攻击者121就获取到了网站的管理员权限。...这就要求我们在请求中嵌入一些额外的授权数据,让网站服务器能够区分出这些未授权的请求,比如说在请求参数中添加一个字段,这个字段的值从登录用户的Cookie或者页面中获取的(这个字段的值必须对每个用户来说是随机的...攻击者伪造请求的时候是无法获取页面中与登录用户有关的一个随机值或者用户当前cookie中的内容的,因此就可以避免这种攻击。...防范技术 Synchronizer token pattern 令牌同步模式(Synchronizer token pattern,简称STP)是在用户请求的页面中的所有表单中嵌入一个token,在服务端验证这个

    2.5K20

    3分钟短文:Laravel表单验证的“指挥中心”:FormRequest

    引言 上一章我们学习到,Laravel控制器内引入 ValidatesRequests trait,从而使得继承了基类控制器的类拥有了验证器的所有方法。...下面我们根据业务逻辑,首先修改 authorize 方法,满足以下两个条件,才允许验证: 必须登录状态 用户必须发布过帖子 下面是代码的实现: public function authorize() {...->route()方法读取,这与 get/post 方法的获取有所不同,大家要记得区分。...$request) { // 存储数据 }); 这条路由是我们上述代码中演示位置参数 blogPost 时引入了,我们在执行方法中引入了表单请求类,laravel自动会将请求数据代入到该类内执行验证...我们完全可以从最后一个写作方法中延伸出更多的花样玩法,大家可以去github借鉴大神的写法,学习更多技巧。

    68820

    3分钟短文:Laravel表单验证的“指挥中心”:FormRequest

    引言 上一章我们学习到,Laravel控制器内引入 ValidatesRequests trait,从而使得继承了基类控制器的类拥有了验证器的所有方法。...下面我们根据业务逻辑,首先修改 authorize 方法,满足以下两个条件,才允许验证: 必须登录状态 用户必须发布过帖子 下面是代码的实现: public function authorize() {...->route()方法读取,这与 get/post 方法的获取有所不同,大家要记得区分。...$request) { // 存储数据 }); 这条路由是我们上述代码中演示位置参数 blogPost 时引入了,我们在执行方法中引入了表单请求类,laravel自动会将请求数据代入到该类内执行验证...我们完全可以从最后一个写作方法中延伸出更多的花样玩法,大家可以去github借鉴大神的写法,学习更多技巧。

    95700

    业务层,到底需不需要服务化?

    (1)首先调用商业基础服务,获取商业广告帖子数据,用于顶部置顶/精准的广告帖子展示; (2)再调用搜索基础服务,获取自然搜索帖子数据,用于中间自然搜索帖子展示; (3)再调用推荐基础服务,获取推荐帖子数据...,用于底部推荐帖子展示; (4)再调用用户基础服务,获取用户数据,用于右侧用户信息展示; (5)… 如果只有一个列表页这么写还行,但如果有招聘、房产、二手、二手车、黄页等多个业务,都这么获取共性数据,而只有少部分个性数据...RPC接口,分别获取数据,底层数据获取的复杂性,全都屏蔽在了此处; 是不是连接关系也看起来更清晰?...这样的好处是: (1)复杂的从基础服务获取数据代码,只有在通用业务服务处写了一次,没有代码拷贝; (2)底层基础数据服务接口发生变化,只有通用业务服务一处需要升级修改; (3)如果有bug,不管是底层基础数据服务的...于是,当业务越来越复杂,垂直拆分的系统越来越多,基础数据服务越来越多,底层数据获取复杂性成为通用痛点的时候,就应该抽象出通用业务服务,简化数据获取过程,提高数据获取效率,向上游屏蔽底层的复杂性。

    53910

    图解系统设计之Instagram

    我们的数据本质是关系型,并且我们需要数据的顺序(帖子应按时间顺序出现)和即使在故障的情况下也不会丢失数据(数据持久性)。此外,我们的例子中,我们将从关系查询中受益,如根据用户 ID 获取关注者或图像。...向用户发送已成功存储照片的更新。若遇到错误,也会通知用户。 查看照片的过程与上述流程类似。客户端请求查看一张照片,从数据库中获取与请求匹配的合适的照片,并显示给用户。...② 推送方法 推送方法中,每个用户都负责将他们发布的内容推送给关注他们的人的timeline。在之前的方法中,从每个关注者那里拉取帖子,但在当前方法中,我们将帖子推送给每个关注者。...基于拉取的用户:关注者数量为数十万或数百万的名人用户。 时间轴服务从基于拉取的关注者那里拉取数据并将其添加到用户的时间轴中。...在请求时,我们从键值存储中获取数据并显示给用户。键是 userID,而值是时间轴内容(指向照片和视频的链接)。

    26810

    Laravel代码简洁之道和性能优化

    在此示例中,将重新激活非活动用户并updated_at更新时间戳: DB :: table ( 'users' )-> upsert ( [ 'username' => 'foo' , 'active...第二个参数是唯一标识记录的列。除 SQL Server 外的所有数据库都要求这些列具有PRIMARY或UNIQUE索引。 提供要更新的列作为第三个参数(可选)。默认情况下,将更新所有列。...在 Laravel 5.5-5.7 中,这需要HasUpsertQueriestrait: class User extends Model { use \Staudenmeir\LaravelUpsert...->upsert(...); 在 Eloquent 中,所有版本的 LumenHasUpsertQueries都需要该特性。...当然了还是有一些注意点和坑,下面分享一下 注意的问题 要根据需求添加唯一索引 根据官方文档中的说明,我们的model中必须添加这行代码,才能以Eloquent的方式用 use \Staudenmeir\

    5.8K20

    系统设计:Facebook的新闻流设计

    4.将此提要存储在缓存中,并返回要在Jane提要上呈现的顶级帖子(比如20篇)。 5.在前端,当Jane完成当前提要时,她可以获取接下来的20个帖子,从服务器等。...这里需要注意的一点是,我们生成了一次提要并将其存储在缓存中。新的呢从Jane关注的人那里收到的帖子?如果Jane在线,我们应该有一个排名机制并将这些新帖子添加到她的提要中。...5.视频和照片存储,以及缓存:Blob存储,用于存储帖子中包含的所有媒体。 6.新闻源生成服务:收集并排列所有相关帖子,供用户生成新闻源和存储在缓存中。...让我们讨论不同的选择 用于向用户发布提要数据。 1.“拉”模型或扇出加载:此方法涉及保留所有最近的提要数据内存,以便用户可以在需要时从服务器中提取内存。客户可以提取提要定期或在需要时手动获取数据。...“推送”模式或写时扇出:对于推送系统,一旦用户发布了帖子,我们可以立即将此帖子推送给所有追随者。优点是在获取提要时 你不需要浏览你朋友的列表,为他们中的每一个人获取提要。这很重要减少读取操作。

    6.3K283

    3分钟短文 | Laravel获取关联表指定列的3个方法

    今天我们说一说,在Laravel中,如何关联模型,以及制定返回列,以精简返回数据。 学习时间 假如有两个模型 User 和 Post,一个用户会发布多个post,也就是一对多的关联关系。...在User模型中,指定此关系: public function post(){ return $this->hasmany('Post'); } 反过来,在Post模型中,必然有一个发布者,是一对一的映射...: public function user(){ return $this->belongsTo('User'); } 现在假如有一个查询,获取所有的帖子,并返回发布者的信息。...关联关系 我们注意到,在关联关系的声明上,第一节仅使用了 belongTo,hasMany 这样的属性,其实还可以链式调用。这样对于所有使用 with 语句关联的模型查询,都会生效。...:-( 写在最后 本文通过2种确切可用的方式,裁剪了关联模型返回列的内容。 在实际代码中,第一种使用闭包修剪SQL语句,用途较为广泛。 第二种方式影响全局,一般不推荐。

    2K20

    宇宙最强语言PHP的“全栈”框架——Laravel来了!

    点击“博文视点Broadview”,获取更多书讯 在动态网页发展前期,编写一个Web应用程序的方法和今天有很大不同。...“因为山在那里”,也许是攀登一座山峰的理由,但是选择使用一个特定的框架可以有更好的理由。值得思考的是 :为什么使用框架?更准确地说,为什么使用Laravel这个框架?...假如你要创建一个 Web 应用,会从哪里开始呢? 也许会从 HTTP 请求开始,所以现在需要评估所有可用的 HTTP 请求库和 HTTP 响应库并在其中选择一个。...所有在构建 Web 应用程序时最常见的任务,从数据库交互到身份验证、从队列到电子邮件再到缓存,都通过 Laravel 提供的组件简化了。...在其他框架中,即使使用了推荐的配置,也需要对所有的设置进行声明。因此,使用 Laravel 构建的项目比其他大多数 PHP 框架花费的时间少。 Laravel 还专注于简约性。

    2.5K10

    WP Engine推出AI驱动的WordPress网站搜索

    WP Engine 的一个测试工具允许用户在几毫秒内对使用 WordPress 构建的网站执行语义搜索。...专有工具在本周的 WP Engine 虚拟 De{Code} 会议 中向开发者和其他 WordPress 用户展示。...他补充说,越来越多的用户期望在搜索中获得更类似于 GPT 的体验。而且风险很高:谷歌统计数据显示,82% 的客户会避开他们在其中遇到搜索困难的网站。...“我们所做的是索引和映射你的 ACF 字段,开箱即用,点击一个按钮,无需自定义映射,无需简码,无需任何代码,你只需在智能搜索中默认索引所有 ACF 和所有自定义帖子类型,”他说。...将搜索从 WordPress 数据库中卸载,并自动索引 ACF 字段中的所有自定义帖子类型——我们认为这是我们在此处 […] 独一无二的地方;再次希望以 WordPress 开发人员工作的方式工作,”他说

    14610

    从零打造自己的CICD系统|php项目部署v1版本

    从零打造自己的CI/CD系统|php项目部署v1版本 今天我们结合前面所讲内容进行PHP项目的完整部署流程,当然我们不会一步到位,会慢慢迭代完善部署的整个过程。...composer 工具 Ansible 安装部署 •安装ansible•调整配置文件ansible.cfg pip install ansible php环境安装部署 •不要想着去源码编译•先安装remi源•然后在安装...上找了一个demo,php-laravel-hello-world[3], 我本地编译过,运行没问题 Ansible roles编写和存放 •Ansible roles存放位置在/etc/ansible.../roles下,具体还要看ansible.cfg里如何定义roles的路径•使用的时候直接采用单独目录的形式来存放该应用对应的配置文件 Ansible和远程机器通信 •远程机器上部署应用建议使用普通用户...,便于回滚•每一步操作都要注册,下一步操作之前判断上一步执行结果成功与否•执行数据流的过程中,屏蔽异常主动退出,人工捕获异常,然后在退出之前清理前面执行的所有操作•composer生产使用的时候,尽量加上

    1.1K40

    CVE-2021-39165: 从一个Laravel SQL注入漏洞开始的Bug Bounty之旅

    ,配置如下 前台和API中的读取操作(GET)不需要用户权限 API中的写入操作(POST、PUT、DELETE)需要用户权限 后台所有操作都需要用户权限 一些特殊操作都会经过逻辑判断,比如上文说到的两个操作...); 所以,通过这个方法,我可以做到了一件事情:从控制where()的第一个参数,到能够完整控制where()的所有参数。...且Laravel不支持堆叠注入,那么要利用这个漏洞,就有两种方式: 通过UNION SELECT注入直接获取数据 通过BOOL盲注获取数据 UNION肯定是最理想的,但是这里无法使用,原因是用户的这个输入会经过两次字段数量不同的...因为表结构已经知道,成功获取用户、密码: 0x05 后台代码审计 这个注入漏洞的优势是无需用户权限,但劣势是无法堆叠执行,原因我在星球的这篇帖子里有介绍过(虽然帖子里说的是ThinkPHP)。...解决这个问题的方法还是回归到代码审计中,Cachet获取用户输入是使用graham-campbell/binput,我在前面审计的时候发现其在获取输入的基础上会做一次过滤: public function

    1K20

    多业务融合推荐策略实践与思考

    从表格中可以看出不同类型的兴趣效果不同,扩展出来的兴趣的效果远低于原始兴趣,而泛扩展的效果会更差。...用户对黄页的兴趣占比是20%,但候选集中黄页占比只有10%,也就是说即便推出候选集中所有的黄页贴子,也不能满足黄页帖子的占比要求,这种情况就用其他品类的帖子进行补足。...:不同的场景有不同的目标,整体目标可能是提升CTR,但是某些具体场景可能是提升用户体验,也可能是增加停留时长,多个目标之间的平衡也是优化过程中需要持续解决的问题; 算法和策略之间的关系:从解决问题和取得实际效果的角度来看...典型的方案有这几个: 直接屏蔽:屏蔽帖子——对这个用户不再展示该帖子,屏蔽标签——不再展示类似标签的帖子,比如用户多次提供租房帖子的负反馈,那么就对该用户屏蔽所有有租房类标签的帖子。...由于这种方案比较生硬,所以往往达不到好的效果; 建立策略:挖掘用户对哪一类标签不感兴趣,在推荐时对这一类标签的权重进行修正,不会直接屏蔽此类帖子; 建立算法模型:通过算法把负反馈的结果映射成独立的特征,

    1.5K21

    Linux:进程信号(二.信号的保存与处理、递达、volatile关键字、SIGCHLD信号)

    当进程收到一个信号时,内核会根据信号处理表中对应信号的处理函数来执行相应的操作。 信号未决位图:在进程接收到一个信号时,内核会更新进程的信号未决位图,用于记录当前未被屏蔽的信号。...如果oldset参数不为NULL,则会将之前的信号屏蔽集存储到oldset中。 sigpending系统调用 sigpending是一个系统调用,用于获取当前进程挂起/未决(pending)的信号集。...——进程从内核态切换会用户态的时候,信号会被检测并处理 每次进程从内核态切换到用户态时,操作系统会依次检查进程是否有未处理的信号。...当用户进程发起系统调用时,会将系统调用号放入特定寄存器中,CPU根据系统调用号找到对应的系统调用处理程序在系统调用表中的位置,然后跳转到该函数的地址进行调用。...在函数调用失败的情况下,可以通过errno全局变量获取具体的错误信息。

    17710

    Science调查近万名新冠研究者:38%回复称被网络骚扰,18%受死亡威胁

    这一具体问题的调查中,受访研究人员采取:在社交媒体上屏蔽他人、删除账号、拒绝公开宣传等自我保护措施,以避免骚扰和抵制骚扰。...在这些措施中,「在社交媒体上屏蔽或沉默」是最便捷的自我保护方式,41.5%(81/195)的人使用了该方法。...科研人的推特:从悄无声息到活粉数十万 根据「期刊文章研究所」(Research on Research Institute)的一份报告,推特平台发布了大部分提及COVID-19 文献的帖子:截至 2021...事实证明,Cevik的方法很受欢迎:其他推特用户已转发了她200多篇关于COVID-19研究论文的帖子至少12,000次,使她的推特帐户在相关比较上排名前50 。 ...在论文发表仅3天后,Meyerowitz-Katz在推特的一篇长帖中, 对此论文的数学假设提出了质疑。不久之后,刊发此论文的刊物邀请他提交评论以供发表。

    40130

    站点选项 WordPress 插件:管理和删除无用的站点选项

    管理站点选项 安装好之后,在 WPJAM 菜单下会多出一个「站点选项」的子菜单,点击进去,即可查看你站点所有非 WordPress 系统自动生成的选项: 如果选项存储为字符串或者非序列化存储,则直接显示...用户管理 最强 WordPress 一键用户管理插件。 支持自定义头像,屏蔽个人设置,优化姓名设置, 隐藏登录名,限制登陆失败次数,防止密码被暴力破解等功能。...外部链接 将文章或评论中的外部链接加上安全提示的中间页。 让用户确认之后再跳转,并还支持添加 nofollow rel 属性。 话题标签 文章中插入 #话题标签#。...文章隐藏 设置文章在列表⻚不显示,并且可以根据不同平台进行设置 Meta Data 可视化管理 WordPress Meta 数据,支持所有内置的 Meta 数据: Post Meta,Term Meta...站点选项 查看和管理所有非 WordPress 系统自动生成的站点选项。 如果你觉得某个选项无用,可以直接删除它。 后台论坛 WordPress 后台论坛,支持创建帖子,分组,消息。

    1K30

    【译】20个 Laravel Eloquent 小技巧(上)

    下面是翻译自 Laravel-News 的一篇教程,总结了 Laravel 的对象关系映射框架(ORM)的几个小技巧。...比如说你需要定义一个特定类型的用户的关联关系并且用邮箱信息来排序,那你可以这么做: public function approvedUsers() { return $this->hasMany...public $timestamps = false; // 或者完全不用他 甚至还有更多,我仅仅列出了最有意思的一部分,更多请查看默认抽象Model类的代码,并查看所有使用的trait 方法。...使用关系模型字段排序 一个更复杂的“技巧”。 如果你有帖子,但要通过最新帖子对它们进行排序? 顶部有最新更新主题的论坛中非常常见的要求,对吧?...BelongsTo 关联的默认模型对象 假设有个 Post(帖子) 对象属于 Author (作者)对象,在 Blade 模板中有下面的代码 {{ $post->author->name }} 但是如果作者被删除

    2.3K50
    领券