Скорость вставки в Heroku PostgreSQL слишком мала.Почему это? - PullRequest
0 голосов
/ 01 июня 2019

Я работаю над сайтом чата с Python Flask, Flask socket.io и базой данных Heroku PostgreSQL.Когда сообщение отправляется из Javascript в мой файл Python, я хочу сохранить это сообщение в своей базе данных, а затем отправить сообщение клиентам.Без сохраняющей части, испущенное сообщение появляется очень быстро, как и ожидалось.Но когда я закодировал в части «Вставить в базу данных», отправленное сообщение занимает не менее 3 секунд, прежде чем появится в браузере.Поэтому я предполагаю, что это проблема производительности базы данных.Есть ли способ сделать этот процесс быстрее?Могу ли я как-то разрешить отправку сообщения и сначала его просмотреть пользователю, а затем выполнить вставку?

Я использую SQLAlchemy ORM в качестве способа вставки сообщения в базу данных.Я пытался использовать обычную командную строку SQL, но это не дает существенных изменений.

Python-код (сервер):

@socketio.on("submit message")
def socket_message(data):

    user_id = session["user_id"]

    rows = User.query.get(user_id)
    display_name_user = rows.display_name

    now = datetime.datetime.now()
    currentDT = now.strftime('%Y-%m-%d %H:%M:%S')

    msg = data["msg"]

    add_chat = Chat(display_name=display_name_user, messages=msg, time=currentDT)

    db.session.add(add_chat)
    db.session.commit()

    emit("announce message", {"msg": msg, "display_name_user": display_name_user}, broadcast=True)

Javascript:

// Listen to events within the page
document.addEventListener('DOMContentLoaded', () => {

                // Connect to websocket
            var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);

            // When connected, start the process to emit the message when input is given
            socket.on('connect', () => {

                // When the user press Enter in the input box, link this to a button click
                document.querySelector('#input-message').addEventListener('keyup', function(event) {
                    if (event.keyCode === 13) {
                        event.preventDefault();
                        // Linking pressing Enter with button being clicked
                        document.querySelector('#message-button').click();
                    };
                });

                // When button is clicked, emit the message
                document.querySelector('#message-button').onclick = () => {
                    const msg = document.getElementById('input-message').value;
                    socket.emit('submit message', {'msg': msg});

                    // Clear the input field
                    document.getElementById('input-message').value = ""
                }
            });

            // When a new message is announced, broadcast it to all computers in the channel
            socket.on('announce message', data => {

                // Append new message to message list
                const header = document.createElement('header')
                header.innerHTML = data.display_name_user

                const li = document.createElement('li');
                li.innerHTML = data.msg;

                const hr = document.createElement('hr');

                var message_list = document.querySelector('#message-list');
                message_list.append(header);
                message_list.append(li);
                message_list.append(hr);

                // Scroll to bottom of page when a new message appears
                var message_box = document.querySelector('.message-box');
                message_box.scrollTop = message_box.scrollHeight;
            });
        });

I need the message to be emitted within 1 second maximum.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...