丢丢:腾讯云上实践 SNG MINI 项目

作为 SNG 应届生入职的传统,都会参加 SNG 的 mini 项目,每组大概10人,在短短10天的时间里开发一个相对完善的 APP 。这对整个团队来说是一件十分有挑战的事情,小组内只有两个人负责后台架构/开发,通过云平台部提供给我的支持,我们在腾讯云上搭建了一套相对简单但是功能基本符合需求的后台系统。本文将对后台架构进行简单的介绍。

【产品】丢丢

一款利用 LBS 的失物招领 APP ,支持发布带有地理位置的失物招领信息、关键字匹配失物资讯推送失主。

【后台架构分析】

因为是在后台层面分析,我们主要在技术层面进行介绍。产品的主要功能相对简单,主要实现

  • 丢失物品的发布
  • 拾到物品的发布
  • 将捡到物品跟失主丢失的物品匹配,将匹配物品推送给失主的功能。

其中,主服务的逻辑处理需要至少有两台服务器,防止一台挂掉。其次,数据库也需要有准备,对于本产品来说,更偏重查询的使用。最后,影响性能的是匹配发布丢失物品的人是否与捡到物品信息匹配,再推送的相应丢失人的手机上,这就要考虑怎样处理回更加节省时间,提高效率。

【云服务需求清单】

  • 因为初始资金只有1000元人民币,考虑到 mini 项目的后台压力不大,所以均购买了相对低配的产品:
  • 主服务器:标准型 S1,1核 2GB,1Mbps,云硬盘,基础网络。(广州二区)
  • 备服务器:标准型 S2,1核 2GB,1Mbps,云硬盘,基础网络。(广州三区)
  • 消息处理、推送服务器:标准型 S1,1核 2GB,1Mbps,云硬盘,基础网络。(广州三区)
  • 负载均衡:腾讯云LB,基础网络。
  • 数据库:云储存 Mysql ,最低配,主/备异步复制。
  • 消息缓存:云存储 Redis ,主从,最低配。

【架构图】

【说明】

  • 负载均衡:负载均衡的配置十分简单

只需要绑定后端的实例就可以了,LB默认监听后端的8080端口,而且可以修改对应的权重,因此只要把后端实例的 Nginx/Apache 端口改成8080即可。

  • Apache:
  • Nginx:
  • 由于开发周期短,便于开发和调试,我们选择了php作为后台语言,选择了 larvel 框架进行开发,有兴趣的同学可以移步https://laravel.com/进行详细了解。服务器选择了ubuntu 16.04.01 LST 64位,php7.1版本语言, nginx 做接入。
  • 有了框架,数据库的链接就显得十分方便,直接用数据库的内网ip和相应端口,数据库名称即可链接。如图为 laravel 的数据库配置,具体值配置到了环境变量里:
  • 最为耗时的工作是匹配丢失物品和捡到物品,laravel 框架有一个叫做 queue 的神奇功能。“ Laravel 队列为不同的后台队列服务提供统一的 API ,例如 Beanstalk , Amazon SQS, Redis,甚至其他基于关系型数据库的队列。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和相应的时间。” 所以,果断把最浪费时间的东西丢到 redis 里面,这里不仅可以使用 redis , Amazon SQS 等,也可以使用 rabbitmq , mysql ,只不过,经过尝试, redis 是最快的。
public function handle()
    {

        // 最新上传的捡到物品。
        $newFoundItems = FoundItem::where("state",0)->orderBy('updated_at', 'DESC')->first();
        $foundItem = json_encode($newFoundItems);

        // 丢失物品列表
        $lostItems = LostItem::where("state",0)->get();
        foreach ($lostItems as $item) {
            $lostItem = json_encode($item);
            $job = (new PushService($foundItem,$lostItem));
            dispatch($job);
        }
    }

一旦有新的捡到物品,就将它跟丢失的物品作对比,把这些处理用 Job 的形式,丢到 redis 里面,有专门的服务器去处理 redis 里面的任务。

  • 说到 redis,腾讯云的 redis 有个小坑,“它的密码不是它的密码”,仔细看使用示例之后你会发现,它的密码是“实例名称:密码”,还以为代码写的有问题,导致 redis 连接失败。
  • 后台有一个专门的服务器,用于计算匹配,推送消息。
    /**
     * Execute push  job.
     *
     * @return void
     */
    public function handle()
    {
        $foundItem = json_decode($this->foundItems, true);
        $lostItem = json_decode($this->lostItems, true);

        $distance = $this->getDistance((string)$foundItem["latitude"], (string)$foundItem["longitude"], (string)$lostItem["latitude"], (string)$lostItem["longitude"]);

        $sendMessage = "附近有人找到了你丢失的类似物品,快来看看吧!";

        if($foundItem["category"]==$lostItem["category"])
        {
            if ($distance < 5000) {

                // 查找device_token
                $device_token = PersonalInfo::select("device_token")->where("qqtoken", "")->first();
                $pushMessage = new PushMessage();
                $pushMessage->pushMessage($device_token["$device_token"], $sendMessage);
            }
        }
    }
  • 队列的消费需要一个守护进程监听,这里使用的事 python 的 supervisor 如下图所示,我们的消息推送服务器上开启了20个进程同事监听这一个队列,当有消息需要处理的时候,可以最多达到20个并行处理。到此为止,就是后台的简单概况。
[program:push_service]
process_name=%(program_name)s_%(process_num)02d
command=php /home/ubuntu/laravel/didi/artisan queue:work --queue=default --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=20
redirect_stderr=true
stdout_logfile=/home/ubuntu/laravel/didi/storage/push_service.log

【总结】

Mini 项目,9个人十天的时间,确实有很多考虑不到的地方,跟我厂动辄上亿上千万响应级别的项目,简直是五战的渣渣,但也是一个项目从0到1的实践,踩过了很多坑,也积累了很多经验。 也希望给后面 mini 项目的同学留个参考,做的简陋,供大家吐槽。

虽然我们的项目很小,但是对于正常中小型企业的项目,在腾讯云上构建确实是省时省力,减小了不少运维成本,性能也不错,虽然都是低配服务器,但是压测结果还是很理想。

平时在云上搭个小博客啊,建个小网站玩还是挺爽的。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

宋翔的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

ASLR在Windows与Linux系统之间的差别

作者 Taskiller Hi 基友们,我在上篇文章中讨论了Linux平台上NX的特性。我们已经知道一般情况下NX(Windows平台上称其为DEP)和...

1968
来自专栏python开发者

基于token的多平台身份认证架构设计

随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 。

1225
来自专栏MongoDB中文社区

9月.精华文章推荐

1.《GDPR: Impact to Your Data Management Landscape:Part 3 》

862
来自专栏安智客

TEE相关专利信息 (中篇,涵盖TEE各个方面)

[061] [发明公布] 双执行环境之间双向访问应用的方法 申请公布号:CN105592019A 申请公布日:2016.05.18 申请号:201410613...

1987
来自专栏主机笔记

一个diy新人的装机指南

可能关注本博客的朋友都注意到了,本月一直没有更新博客,因为站长在做一在配置自己电脑。第一次装机,从选配置到购买配件装机也是花了好多的时间,最后一次点亮完美进入系...

2806
来自专栏腾讯大讲堂的专栏

停机优化 - 保持游戏DAU的4个技巧

以游戏运维的视角,从“更新优化(让玩家快速进入游戏)”的角度来解读保持游戏DAU的技巧。更新优化 ? 首先介绍停机优化,看我们是如何把一款国内排名前3的端游停机...

2016
来自专栏Seebug漏洞平台

【BlackHat 2017 议题剖析】连接的力量:GitHub 企业版漏洞攻击链构造之旅

作者:Orange (orange@chroot.org ) 知道创宇404实验室 独家授权翻译 原文地址:http://blog.orange.tw/201...

36516
来自专栏开源优测

移动测试 | CheckList

移动测试CheckList 概述 在正式开始分享Appium前,先来一篇关于移动测试CheckList以便大家了解下移动测试要测试什么。 功能测试 功能测试对于...

3268
来自专栏python开发者

基于token的多平台身份认证架构设计

基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情。 随着移动互联网时代到来,客户端的类型越来越多,...

3216
来自专栏SDNLAB

SDN在云数据中心的应用之VPC产品篇

云数据中心最基础的网络产品就是VPC(虚拟私有云),简单理解就是1个三层路由+若干个IP地址可自定义的网络。一个VPC可允许有多个子网,同子网内部二层互通,不同...

3074

扫码关注云+社区