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

相关文章

来自专栏Java技术交流群809340374

实战讲解高并发和秒杀抢购系统设计

互联网特别是电商平台,阿里双11秒杀、还有12306春运抢票、以及平时各种节假日抢购活动等,都是典型的高并发场景。

1.1K00
来自专栏运维一切

为什么我们不能使用KUBERNETES 原

kubernetes的服务发现到node创建启动,最终到提供服务,中间都离不开iptable的nat模块,在业务高访问量的情况下,这是无法满足性能要求的。

9220
来自专栏韩伟的专栏

如何设计运维友好的服务器端系统

如果我们在开发的时候,就充分考虑到系统的运维需求,就算只进行了一些简单的约束,都能让运维工作有巨大的改进。我想这也是所谓DevOps流行起来的原因吧。

68700
来自专栏章鱼的慢慢技术路

游戏服务器存储系统设计

data——>file(database)——>file system——>hard driver

57530
来自专栏云加头条

韩伟:解谜腾讯游戏海量服务架构

网络游戏和其他互联网服务一样,需要面对承载海量用户的压力,同时还需要满足游戏所要求的低延迟、业务逻辑高复杂度的特性。腾讯游戏研发部资深架构师韩伟为大家带来了“解...

61990
来自专栏Java编程技术

乐观锁原理与实战演练

最近在做一个简单审批流程的项目,由于只有固定二级审批所以没有工作流组件,然后就遇到一个审批节点捞单时候,多个人同时审批时候如何保证业务正常运行的问题,我采用的就...

11520
来自专栏51CTO技术栈的专栏

记一次流量暴增造成的“生产事故”优化经历!

“在一次正常的活动促销之后,客服开始陆续反馈有用户反应在抢标的时候打不开网页或者 APP,在打开的时候标的就已经被抢光了。

51900
来自专栏即时通讯技术

IM群聊消息究竟是存1份(即扩散读)还是存多份(即扩散写)?

上一篇文章《IM群聊消息的已读回执功能该怎么实现?》是说,“很容易想到,是存一份”,被网友们骂了,大家争论的很激烈(见下图)。

18020
来自专栏非著名程序员

Android开发者注意了,是时候陆续停止使用Eclipse开发了

谷歌宣布Android Studio将取代Eclipse 非著名程序员 ? 我相信大家都听说过或者部分开发者已经在使用Android Studio开发了,在...

232100
来自专栏安恒信息

漏洞预警 | CPU数据缓存机制存在设计缺陷

安全漏洞公告 近日,来自于谷歌Project Zero安全团队的安全研究人员等报告,在CPU内核中,存在关于数据缓存边界机制的设计缺陷的“Meltdown”、“...

30480

扫码关注云+社区

领取腾讯云代金券