丢丢:腾讯云上实践 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 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

15个最受欢迎的Python开源框架

本文从GitHub中整理出15个最受欢迎的Python开源框架。这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。 Django: P...

2418
来自专栏EAWorld

代码实战:从单体式应用到微服务的低风险演变

作者:Christian Posta 译者:海松 原题:Low-risk Monolith to Microservice Evolution Part I...

3375
来自专栏性能与架构

网络内容缓存CDN的工作原理

CDN的全称是Content Delivery Network,即内容分发网络 CDN的目的就是提高用户访问网站的响应速度 提速的基本思路 例如你的网站服...

3657
来自专栏杨建荣的学习笔记

一个简单的bigfile tablespace无法扩展的案例处理 (r8笔记第31天)

最近帮助开发的同学处理了一个简单的问题,想通过这个问题来反思一下。 在一天下午的时候,开发的同事突然找到我说,有一个开发的数据库貌似有些表空间的问题,...

2747
来自专栏张善友的专栏

SQL Server 2008 R2 主数据服务

主数据服务(Master Data Services,MDS)既是一个概念又是一个产品,主数据服务的概念是对核心业务数据有一个集中的数据入口看守人,数据项如客户...

1906
来自专栏腾讯云安全的专栏

避免 MongoDB 被勒索详解,腾讯云上更安全

2074
来自专栏数据和云

安全预警:独立发布的Oracle严重 CVE-2018-3110 公告

在 2018年8月10日,Oracle 独立的发送了一封"安全警告"邮件给所有的 Oracle 用户,这封邮件的标题是:Oracle Security Aler...

992
来自专栏小狼的世界

Facebook的图片存储

为了减少对昂贵的存储解决方案(诸如NetApp和Akamai,我所在的单位用了一套NetApp,性能和稳定性都不错,价格当然也不菲),Facebook在2009...

1235
来自专栏用户2442861的专栏

关于图片或者文件在数据库的存储方式归纳

http://www.cnblogs.com/wangtao_20/p/3440570.html

1161
来自专栏北京马哥教育

远离故障的十大原则

故障是运维人员永远的痛。相信每一个运维人员的KPI中都有一项:可用性。可用性高就是不出故障,各个公司对可用性和故障评级的标准都不相同,但是避免故障的方法却是殊途...

2676

扫码关注云+社区