账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    mongodb如何去处理并发请求?
    26
    0

    微信支付文档提到:对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱,微信服务器向同一支付结果通知频率为15/15/30/180/1800/1800/1800/1800/3600(单位:秒).
    我的疑问:
    (1)同一支付通知是应该不存在并发的?
    (2)这里的并发是不是微信服务器频繁请求同一接口,导致同一时间不同支付通知同时请求接口,但数据库来不及读写,造成并发?
    (3)如果有并发情况,mongodb端有什么解决办法.

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 寂寞寂寞就好 普通会员 1楼

      MongoDB 提供了多种方法来处理并发请求,包括但不限于:

      1. 使用多线程:MongoDB 提供了一个名为 MongoClient 的类,它允许您创建一个 MongoClient 实例,该实例具有多线程功能。您可以使用 MongoClient 实例创建多个 MongoClient 实例,并使用这些实例一起执行数据库操作。这允许您同时处理多个并发请求。

      ```javascript const MongoClient = require('mongodb').MongoClient; const clients = [];

      const client1 = new MongoClient('mongodb://localhost:27017/mydatabase', { useUnifiedTopology: true }); const client2 = new MongoClient('mongodb://localhost:27017/mydatabase', { useUnifiedTopology: true });

      async function executeQuery(query) { const client = await clients[Math.floor(Math.random() * clients.length)]; const collection = client.db('mydatabase').collection('mycollection');

      try { await collection.find(query).toArray(); } catch (err) { console.error(err); } }

      executeQuery('SELECT * FROM mycollection'); executeQuery('SELECT * FROM mycollection'); ```

      1. 使用并发集合:MongoDB 提供了一个名为 MongoClient 的类,该类允许您创建一个 MongoClient 实例,该实例具有并发集合功能。您可以使用 MongoClient 实例创建多个 MongoClient 实例,并使用这些实例一起执行数据库操作。这允许您同时处理多个并发请求。

      ```javascript const MongoClient = require('mongodb').MongoClient; const clients = [];

      const client1 = new MongoClient('mongodb://localhost:27017/mydatabase', { useUnifiedTopology: true }); const client2 = new MongoClient('mongodb://localhost:27017/mydatabase', { useUnifiedTopology: true });

      async function executeQuery(query) { const client = await clients[Math.floor(Math.random() * clients.length)]; const collection = client.db('mydatabase').collection('mycollection');

      try { await collection.find(query).toArray(); } catch (err) { console.error(err); } }

      async function executeQueryWithMulti() { await Promise.all([ executeQuery('SELECT * FROM mycollection'), executeQuery('SELECT * FROM mycollection') ]);

      console.log('All queries executed successfully.'); }

      executeQueryWithMulti(); ```

      1. 使用文档级锁:MongoDB 提供了一个名为 mongodb://localhost:27017/mydatabase 的端点,该端点允许您执行查询并获取锁。您可以使用 MongoClient 实例创建多个 MongoClient 实例,并使用这些实例一起执行数据库操作。这允许您同时处理多个并发请求。

      ```javascript const MongoClient = require('mongodb').MongoClient; const clients = [];

      const client1 = new MongoClient('mongodb://localhost:27017/mydatabase', { useUnifiedTopology: true }); const client2 = new MongoClient('mongodb://localhost:27017/mydatabase', { useUnifiedTopology: true });

      async function executeQuery(query) { const client = await clients[Math.floor(Math.random() * clients.length)]; const collection = client.db('mydatabase').collection('mycollection');

      try { await collection.find(query).toArray(); } catch (err) { console.error(err); } }

      async function executeQueryWithMulti() { await Promise.all([ executeQuery('SELECT * FROM mycollection'), executeQuery('SELECT * FROM mycollection') ]);

      console.log('All queries executed successfully.'); }

      async function executeQueryWithMultiAndLock() { const client = await MongoClient.connect('mongodb://localhost:27017/mydatabase', { useUnifiedTopology: true }); const collection = client.db('mydatabase').collection('mycollection');

      try { await collection.find(query).toArray(); const lock = await collection.insertOne({ name: 'Lock' }); console.log('Lock inserted successfully.'); await collection.find(query).toArray(); console.log('All queries executed successfully.'); } catch (err) { console.error(err); } await client.close(); }

      executeQueryWithMultiAndLock(); ```

      请注意,使用文档级锁可能导致读取操作阻塞,因此在处理并发请求时应谨慎使用。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部