1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/myn_wsc-seckill

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

seckill

Проект

Это упрощенная система быстрых продаж, основанная на nodejs, redis, zookeeper, kafka и mysql.

1. Окружение

  1. Одна серверная машина на Aliyun.
  2. Серверная машина должна быть установлена с redis, kafka, mysql и zookeeper.
  3. Одна локальная машина должна быть установлена с postman. Примечание: Установка и настройка kafka и zookeeper можно найти по ссылке: https://blog.csdn.net/wushichao0325/article/details/84993081 или использовать docker для прямого получения образа и установки.

2. Инструменты

  1. postman: используется для параллельного тестирования с помощью функции (Run).
  2. redis: используется для хранения информации о товарах, здесь создается только одно поле counter, которое устанавливается с помощью команды set redis на начальное значение 100, то есть общее количество товаров. Модель данных: counter=100
  3. kafka: используется вместе с zookeeper для создания производителя, который генерирует результаты успешной покупки, чтобы потребители могли синхронизировать данные с mysql. Модель данных: создание темы PRODUCT_NUMBER.
  4. mysql: используется для хранения конечных результатов быстрых продаж. Модель данных: создание базы данных seckill и таблицы seckill, поле id автоинкремент, поле date для хранения времени покупки, поле uid для хранения id пользователя.

3. Реализация кода

  1. Структура папок

Здесь можно вставить изображение2. Зависимости Node.js! Здесь можно вставить изображение3. seckillService.js Обрабатывает запросы на сейлкилл и отправляет результаты сейлкилла вместе с информацией о пользователе через producer Kafka.

var express = require("express"),
    redis = require("redis"),
    kafka = require('kafka-node'),
    Producer = kafka.Producer,
    kafkaClient = new kafka.Client(),
    producer = new Producer(kafkaClient);
    count = 0;
    app = express();
    config = require(".  /config/redis.json");
var bodyParser = require('body-parser');
app.use(express.json());
app.use(bodyParser.json({limit: '1mb'}));  //body-parser парсит данные в формате JSON
app.use(bodyParser.urlencoded({            //эта настройка обязательна после bodyParser.json для кодирования параметров
    extended: true
}));
app.all("*", function (req, res, next) {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With, yourHeaderFeild');
    res.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.setHeader("X-Powered-By",' 3. 2. 1');
    next();
});
app.post('/seckill', function(req, res) {
    console.log('count=' + count++);
    let fn = function(optionalClient) {
        let client;
        if (optionalClient == 'undefined' || optionalClient == null) {
            client = redis.createClient(config);
        } else {
            client = optionalClient;
        }
        client.on('error', function(er) {
            console.error(er.stack);
            client.end(true);
        });
        client.watch("counter"); //наблюдение за полем counter
        client.get("counter", function(err, reply) {
            if (parseInt(reply) > 0) {
                let multi = client.multi();
                multi.decr('counter'); //обновление значения counter в Redis на -1
                multi.exec(function(err, replies) {
                    if (replies == null) { //поле counter используется, ожидаем освобождения
                        console.```log("counter используется");
                        fn(client);
                    } else {
                        var args = {
                            openid: 'b05NZ2Y1WjbE9fRV9MZTBWWQ==',
                            seckillTime: '2018-12-12 00:00:01',
                        }
                        let payload = [{
                            topic: 'PROUDCT_NUMBER',
                            messages: [JSON.stringify(args)],
                            key: "seckill",
``````markdown
partition:0
];
console.log("payload:",payload);
producer.send(payload,function(err,data){
    console.log(data);
});
res.send(replies);
client.end(true);
``````markdown
            } else {
                console.log("Товары закончились");
                res.send("Товары закончились");
                client.end(true);
            }
        });
    }
    fn(null);
});
app.listen(8888, "0.0.0.0", function () {
    console.log(`Пожалуйста, подключите connectorServer по адресу http://localhost:8888`);
});
```javascript
var kafka = require('kafka-node'),
    Consumer = kafka.Consumer,
    client = new kafka.Client(),
    consumer = new Consumer(
        client,
        [
            {topic: 'CAR_NUMBER', partition: 0}
        ],
        {
            autoCommit: false,
            fetchMaxWaitMs: 1000,
            fetchMaxBytes: 1024 * 1024,
            fromOffset: true
        }
    );
var mysql = require('mysql');
var connection = mysql.createConnection({
    "host": "**.***.***.**",
    "user": "root",
    "password": "password",
    "database": "seckill"
});
connection.connect();
consumer.on('message', function (message) {
    console.log("Полученные данные от производителя:", message);
    let value = JSON.parse(message.value);
    connection.query('insert into seckill set ? ', {date: new Date(), uid: value.openid}, function (error, results, fields) {
        if (error) {
            console.error(error);
        }
        console.log("Успешное внесение данных в базу");
    });
})

Четвертый раздел: Запуск проекта

  1. Запустите Redis на облачном сервере.
  2. Запустите Zookeeper на облачном сервере.
4. Разверните проект на облачном сервере.
5. Перейдите в корневую директорию проекта и запустите seckillService.js и seckill_kafka_consumer.js. Я использую pm2 для управления этими двумя службами.
#### Пятый раздел: Тестирование
Откройте Postman, как показано на рисунке:![Здесь вставьте изображение описания](https://img-blog.csdnimg.cn/20181214140144265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1c2hpY2hhbzAzMjU=,size_16,color_FFFFFF,t_70)

Сначала сохраните этот URL в файл, а затем нажмите кнопку Runner.
Как показано на рисунке:

![Здесь вставьте изображение описания](https://img-blog.csdnimg.cn/20181214140447190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1c2hpY2hhbzAzMjU=,size_16,color_FFFFFF,t_70)

Вы можете использовать POST запрос: http://seckill.ykplay.com/seckill для тестирования.
```Информация для печати сервера```

seckillService.js

![Здесь можно вставить изображение](https://img-blog.csdnimg.cn/20181214140740361.png)

seckill_kafka_consumer.js

![Здесь можно вставить изображение](https://img-blog.csdnimg.cn/20181214141114623.png)

Эти данные подтверждают успешную реализацию функции секционирования.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Система быстрой продажи, основанная на nodejs, redis, zookeeper, kafka и mysql. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/myn_wsc-seckill.git
git@api.gitlife.ru:oschina-mirror/myn_wsc-seckill.git
oschina-mirror
myn_wsc-seckill
myn_wsc-seckill
master