基于egg.js的聊天室后端服务--阿里云性能比赛

简介: 基于eggjs的聊天室服务阿里云ECS Cloudbuild开发者大赛性能挑战赛道

这大概是我写的第一个开源项目:本来是看到了阿里云的服务端性能大赛,就想要去插一脚去试试,结果没想到把程序写好之后卡在了部署上边,正好也有点忙(bushi),就干脆放弃了。所以就在这里把之前写好的代码开源出来,也算是迈出了个人的一小步吧。

主要思路

系统要求

这个聊天室的要求其实很简单: 也就是做一套有bearerAuth token认证的服务系统,可以完成注册账号、登录、登出、创建聊天室、进出聊天室、发言、信息查看等功能就ok。

技术选型

最开始的时候是在java、python、go之间徘徊:

  • java是最熟悉的,但是总感觉spring这一套比较重,不太想搞一套,就放弃了java。
  • python只了解一些django,看了一下新版本的好像变了不少东西··电脑也没有装python环境,索性也就放弃了。
  • go实在是中文资料太少了,想要试一下gin框架感觉指导资料不太多··

正好之前维护了一个组里的nodejs项目,基于阿里的egg.js,维护的时候印象相当好:结构非常明确,有完整的中文文档,调试也非常方便,就干脆用egg.js撸了一套。

数据存储呢用的是mysql,本来想要用mysql + influxdb,感觉influxdb用来存储聊天室的聊天记录非常搭配,一个measurement就是一个聊天室的记录,后来精力有限也就没搞了。

系统架构

在官方给的swagger文档里边,把服务主要分了三块: room、user、message,但是实际写的时候,还是感觉给的 服务 - api的对应关系不太合理,就自己做了重新区分:

  • room
  • creat new room
  • get room information
  • get roo user
  • get room list
  • user
  • enter room
  • leave room
  • create new user
  • login
  • get user by name
  • send message
  • get old message

删掉了message这一块,把一些room的服务移动到了user里边,整体来看更加耦合一些。

数据库构建

构建数据库的时候主要在纠结几点:

  1. 如何将user和他enter的chatRoom对应起来
  2. 聊天信息如何存储

第一个问题就用了一个state表来存储每个user和roomid的对应关系,用userid作为主键,也可以保证每个user只能进入一个room。

第二个问题当前采用的方案是所有的聊天记录都放在一个record表里边,这样确实效率有点低了。我的理想方案是用influxdb来做存储,出于聊天记录持久化的目的,保存策略应该设置为不过期,然后每个roomid都是一个measurement,对应的字段就只有userid和发言内容,时间也可以直接用influxdb自动生成的时间,这样感觉起来就简介了很多。

知识上的薄弱点

对于代理、并发提交这块没研究过,有时间是要学习一下

代码地址

接下来上我的github地址:

nodeChatRoom

相关文章
|
6天前
|
运维 JavaScript Java
Serverless 应用引擎产品使用之在阿里云函数计算中想为两个不同的服务分别开通自定义域名如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
36 1
|
1天前
|
存储 弹性计算 监控
【阿里云弹性计算】阿里云ECS全面解析:弹性计算服务的核心优势与应用场景
【5月更文挑战第20天】阿里云ECS是提供可伸缩计算能力的云服务,支持多种规格实例,满足不同需求。其核心优势包括灵活性、高性能、高可用性、安全性和易用性。适用场景包括网站托管、大数据处理、游戏多媒体应用及测试开发环境。通过Python示例代码展示了如何创建ECS实例,助力企业专注业务发展,简化基础设施管理。
28 5
|
1天前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
116 3
|
4天前
|
缓存 监控 API
利用Python构建高性能的Web API后端服务
随着微服务架构的普及和RESTful API的广泛应用,构建高性能、可扩展的Web API后端服务变得尤为重要。本文将探讨如何利用Python这一强大且灵活的语言,结合现代Web框架和工具,构建高效、可靠的Web API后端服务。我们将分析Python在Web开发中的优势,介绍常用的Web框架,并通过实际案例展示如何设计并实现高性能的API服务。
|
6天前
|
小程序 应用服务中间件 Linux
【Nginx】微信小程序后端开发、一个域名访问多个服务
【Nginx】微信小程序后端开发、一个域名访问多个服务
18 0
|
6天前
|
存储 弹性计算 安全
阿里云服务器计算型c8i实例最新收费标准与性能介绍
阿里云ECS计算型c8i服务器采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。ECS计算型c8i实例支持开启或关闭超线程配置,单台c8i实例最高支持100万IOPS。阿里云ECS计算型c8i实例CPU采用Intel®Xeon®Emerald Rapids或者Intel®Xeon®Sapphire Rapids,主频不低于2.7 GHz,全核睿频3.2GHz。本文为大家介绍计算型c8i实例最新收费标准及性能。
阿里云服务器计算型c8i实例最新收费标准与性能介绍
|
6天前
|
存储 编解码 安全
阿里云服务器计算型、通用型、内存型主要实例性能及选择参考
在阿里云的活动中,属于计算型实例规格的云服务器主要有计算型c7、计算型c7a、计算型c8a、计算型c8y、计算型c8i这几个实例规格,属于通用型实例规格的云服务器有通用型g7、通用型g7a、通用型g8a、通用型g8y、通用型g8i,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y、内存型r8i等实例。不同实例规格的云服务器在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文来详细介绍一下阿里云服务器计算型、通用型、内存型主要实例计算、存储等性能及其适用场景,以供参考。
阿里云服务器计算型、通用型、内存型主要实例性能及选择参考
|
6天前
|
存储 弹性计算 监控
探索阿里云弹性计算:如何优化云服务器ECS的性能与成本
在云时代,【阿里云ECS】的性能优化与成本控制至关重要。利用实例规格选择、自动伸缩、网络和存储配置,可增强性能、减少成本。结合监控工具和优化建议,用户能解决性能问题,提升应用稳定性,实现高效且经济的云计算运营。
42 1
|
6天前
|
消息中间件 Kafka 数据库
【后端面经】【消息队列】22 | 消息队列:消息队列可以用来解决什么问题?-02 超时场景+性能问题
【5月更文挑战第7天】 本文介绍了电商中订单超时取消的处理方法,通过使用消息队列实现延时消息。当订单30分钟后未支付,消息队列将触发取消操作,但需注意并发问题,如采用分布式锁或乐观锁避免并发更新订单状态。乐观锁确保只有订单状态为未支付时才允许支付。主流消息队列如RocketMQ支持延迟消息,而Kafka不支持。 使用消息队列的好处在于解耦和提高系统性能、扩展性和可用性。同步调用会导致性能下降,因为必须等待所有调用完成。并发调用虽可提升性能,但仍逊于消息队列,且无法解决扩展性和可用性问题。
24 1
|
6天前
|
Cloud Native 关系型数据库 OLAP
高效易用的数据同步:阿里云瑶池 Zero-ETL服务来啦!
在大数据时代,企业有着大量分散在不同系统和平台上的业务数据。OLTP数据库不擅长复杂数据查询,不具备全局分析视角等能力,而OLAP数据仓库擅长多表join,可实现多源汇集,因此需要将TP数据库的数据同步到AP数据仓库进行分析处理。传统的ETL流程面临资源成本高、系统复杂度增加、数据实时性降低等挑战。为了解决这些问题,阿里云瑶池数据库提供了Zero-ETL服务,可以快速构建业务系统(OLTP)和数据仓库(OLAP)之间的数据同步链路,将业务系统的数据自动进行提取并加载到数据仓库,从而一站式完成数据同步和管理,实现事务处理和数据分析一体化,帮助客户专注于数据分析业务。
100 0