首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql实时消息传递

Mysql实时消息传递
EN

Stack Overflow用户
提问于 2016-11-02 07:15:59
回答 3查看 14.7K关注 0票数 5

不确定这个问题在这里是否正确,如果不正确,我将删除它。

我正在使用后端AWS EC2创建一个社交网络ios应用程序,我使用php和MYSQL来运行它。

我现在想知道如何将即时消息添加到我的应用程序中,实时有点像firebase。

不确定如何继续或使用什么,也许有某种框架用于mysql,不确定,这就是为什么我想试着从在这一领域有更多经验的人那里获得一些建议……

我不确定如何将我当前mysql数据库中的所有用户详细信息连接到firebase或我所使用的任何服务!

如果任何人能帮助我或把我带到正确的方向,请这样做!

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2016-11-04 17:26:12

这真的取决于你期望从这里得到多少流量。假设硬件大小合适,配置优化,表结构合理,MySQL完全能够处理每秒数以万计的查询。因此,即使假设每秒轮询一次,也可以在一台服务器上为数千个并发用户提供服务,但在这里,瓶颈将是您的应用程序服务器,而不是MySQL。您会发现,在担心数据库之前,您需要对该层进行扩展。

尽管MySQL可能不是最好的解决方案,但还有其他因素需要考虑:

  • 您已经安装了MySQL
  • 您已经了解MySQL
  • 您的应用程序已经连接到MySQL
  • 您已经在MySQL

中存储了一些数据

如果您沿着将一项新技术引入堆栈的道路走下去,请记住可能的成本:

  • 您仍然需要“连接”您的数据,除非您想要将完整的数据集迁移到另一个数据库,关于
  • ,您将不得不对其进行管理
  • 您将必须对其进行优化
  • 您将必须对其进行监视<

>H119您将必须学习它

您是否准备好应对管理两个数据库所带来的额外复杂性?(数据同步、附加库、分散的专业知识等)

过早优化是万恶之母。

假设InnoDB的一些考虑:

  • 保持较小的行大小(小于8k以保存自动递增的主键
  • 归档消息)
  • 如果您已更新列,则可能希望分隔
    • 尝试仅写入一次消息,并避免在更新时进行更新

举个例子:

代码语言:javascript
复制
create table message_meta (
    id int unsigned not null primary key auto_increment,
    message_id int unsigned not null,
    recepient_id int unsigned not null,
    is_seen tinyint unsigned not null default '0',
    seen_at timestamp null,
    UNIQUE KEY (recepient_id, message_id),
    KEY (recepient_id)
);

create table message (
    id int unsigned not null primary key auto_increment,
    body varchar(4095),
    created_at timestamp not null default current_timestamp,
    sender_id int unsigned not null,
    KEY (sender_id)
);

如果您达到了MySQL被证明是瓶颈的程度,您仍然可以扩展它(复制、分片等)。在那之后,你可以开始使用Redis,在那里有最新的消息,并将MySQL作为永久存储。

票数 14
EN

Stack Overflow用户

发布于 2016-11-09 23:24:31

“即时”源于术语“实时”;客户端代码可用于向服务器发送请求。从头开始编写即时消息应用程序很复杂-有很多事情需要考虑:

基于角色的成员注册和登录(会话authentication)

  • Messaging身份验证(Role based access control)

  • Protecting
  • attacks )和类似的

jQuery是一个免费的、开源的JavaScript框架。您可以使用CDN或下载CDN。发送消息的示例如下所示。

代码语言:javascript
复制
$(document).ready(function() {
    var someSharedUniqueCode = 'Both the recipient and sender uses this key to communicate';
    var message = 'This is an example message';
    $.post('/messages/send/' + message, { communicationKey: someSharedUniqeCode }).done(function(chat) {
    if(chat.State) {
        $('#' + someSharedUniqueCode).append(chat.Message);
    } else {
        $('#' + someSharedUniqueCode).append('Some error message');
    }
});

当然,您需要在.htaccess中设置ReWrite规则,以便为请求(MVC)编写控制器,如下所示。

代码语言:javascript
复制
Router::Map('POST', '/messages/send/[*:m]', function($message) {
    $authKey = $_POST['communicationKey'];
    if(!$authKey && !$message) { return; } // your code on error

    // TODO: Check user is logged in
    // TODO: Check user RBAC is able to communicate in this chat

    header('Content-Type: application/json');

    $message = new SomeMessageController(); // create a controller and modules that access the database
    echo json_encode(array(
        'State' => $message->setAuthentication($authkey) // example method
                           ->parseMessage($message) // example method
                           ->save() // example method
    ), true);
}, 'Message Sender');

请记住,以上所有信息都应该存储在数据库中,用户只有在登录时才能发送消息,因此您需要添加一个控制器来确保他们已经登录。

如果您不清楚MVC方法,这里有一个开放源码的,其中包含一组很好的文档。

票数 3
EN

Stack Overflow用户

发布于 2016-11-11 00:48:10

我强烈建议使用Firebase作为实时数据库,使用SQL作为静态内容的全部running on a Node.js server (可以在亚马逊网络服务上运行)。

实时消息传递是困难的,没有Firebase,这将是一个漫长的旅程。

如果您设置为不使用Firebase...

1)使用Socket.IO与客户端和服务器进行实时连接,双向传递数据非常容易,而使用REST时,您需要不断地ping服务器以获取新消息(这会占用大量资源,并且不会进行扩展)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40370069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档