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

相关文章

来自专栏程序员的SOD蜜

功能实现了软件就做好了吗?

    常常在问自己这样一个问题,也听到很多人都说“先实现功能”,也许在某种意义上不得不如此,但我认为这不是真正意义上的软件开发,实现功能重要,软件的维护更重要...

23310
来自专栏FreeBuf

安卓系统里最好用的VPN工具汇总

本文将告诉各位同学如何通过VPN来保护Android手机的隐私安全,你也许不需要花任何的钱,但免费的VPN应用也有其不足之处。 ? 在Android手机上使用V...

70910
来自专栏非著名程序员

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

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

20010
来自专栏Java技术交流群809340374

最新鲜的美团现场面试41题(三面技术+HR面):Redis+Kafka+分布式

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

1750
来自专栏韩伟的专栏

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

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

5360
来自专栏Java编程技术

乐观锁原理与实战演练

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

862
来自专栏即时通讯技术

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

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

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

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

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

3700
来自专栏Java技术交流群809340374

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

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

3320
来自专栏PHP在线

关于高并发和秒杀系统,你知道的和不知道的一些事

大家也许开发过高并发的系统或者秒杀程序,但肯定都有接触过,像电商平台的秒杀、抢购等活动,还有12306春运抢票。

1133

扫码关注云+社区