Я задавал некоторые вопросы об этой теме c, но я все еще не пришел к выводу, и я все еще совершенно не уверен в том, какой подход я должен использовать здесь, поэтому я решил задать новый вопрос со всеми детали, чтобы быть как можно более точными c.
Проблема : у меня есть внешний сценарий Python (мы назовем сборщик данных ) который в реальном времени получает сделки с различных рынков криптовалюты и выводит их на мою консоль; Этот скрипт работает и работает на своем сервере, и его операции печати работают безупречно. С другой стороны, у меня есть приложение Django. Когда пользователь открывает страницу в моем приложении Django, он должен получать сделки для определенного рынка c. Пример: пользователь открывает рынок ETHUSD> пользователь должен получать в режиме реального времени сделки для ETHUSD от сборщика данных. Поэтому мне нужно найти способ заставить сборщик данных отправлять сделки в мое приложение Django при открытии страницы. Мне не нужно хранить эти данные в базе данных, мне нужно только, чтобы их видел пользователь, и ничего больше.
ВОЗМОЖНЫЕ ПОДХОДЫ
1) Сохранение в базе данных и опрос Я думал обновить данные до БД, а затем, начиная с Django, просто запросить базу данных. Это неосуществимо, потому что, как я уже сказал, сборщик данных извлекает сделки с различных рынков каждую секунду, так что это приведет к огромному количеству запросов как с сервера, так и с клиента, также я не хочу хранить данные, поэтому я не могу идти по этому пути.
2) Pusher Pusher, возможно, лучшее решение для этого, но в конечном итоге оно станет слишком дорогим для меня.
3) Redis PUB / SUB Это был наиболее перспективный вариант: для каждого рынка сборщик данных создает канал Redis. В моем приложении Django, когда пользователь открывает страницу, создается соединение с правым каналом, и данные извлекаются. Пример: пользователь открывает страницу ETHUSD -> соединение с каналом Redis 'ETHUSD' установлено, и сделки принимаются. Проблема: Создание соединения с каналом Redis из Django Потребителей каналов может привести к операции блокировки, поэтому это невозможно.
4) Аннотация idea Это идея, которая у меня была, но я не знаю, ЕСЛИ и КАК это было бы возможно с точки зрения кода. На сборщике данных я бы создал для каждого рынка «канал» или «комнату», используя библиотеку веб-сокетов. Затем из внешнего интерфейса моего приложения Django я бы просто установил соединение с этим «каналом», используя Javascript. Как я уже сказал, я не знаю, если это что-то выполнимо и как.
Чтобы сделать это как можно более точным c, мне нужно решение этой проблемы. Мне нужен подход для решения этой проблемы, который бы работал на производстве, если таковой имеется. Я готов дать более подробную информацию, если это необходимо. Поскольку эта проблема мучает меня, любые советы очень важны!
Мой код:
data-collector.py
from binance.client import Client
import json
from binance.websockets import BinanceSocketManager
client = Client('', '')
# A list of the tickers, they are some hundreds
tickers = ['ETHBTC', 'BNBBTC', 'BATBTC', 'BTCUSDT' ....]
# This function is used to do something with the response,
# such as printing it
def process_message(message):
JSON1 = json.dumps(message)
JSON2 = json.loads(JSON1)
#define variables
Rate = JSON2['p']
Quantity = JSON2['q']
Symbol = JSON2['s']
Order = JSON2['m']
print(Rate, Quantity, Order, Symbol)
bm = BinanceSocketManager(client)
# For every market, start the connection and stream the trades
for market in tickers:
bm.start_trade_socket(market, process_message)
bm.start()
Моя база c Django Каналы потребителя
class EchoConsumer(SyncConsumer):
def websocket_connect(self, event):
self.send({
'type': 'websocket.accept'
})
print('Connected')
def websocket_receive(self, event):
print('Received')
self.send({
'type': 'websocket.text',
'text': event,
})
def websocket_disconnect(self, event):
print('Disconnected')
Код веб-сокета моего интерфейса
<script>
// websocket scripts
var loc = window.location
var wsStart = 'ws://' + window.location.host + window.location.pathname
console.log(wsStart)
var endpoint = wsStart + loc.host + loc.pathname
var socket = new WebSocket(endpoint)
if (loc.protocol == 'https:'){
wsStart = 'wss://'
}
socket.onmessage = function(e){
console.log("message", e)
}
socket.onopen = function(e){
console.log("message", e)
}
socket.onerror = function(e){
console.log("message", e)
}
socket.onclose = function(e){
console.log("message", e)
}
</script>