Как изменить метеорный метод на независимый поток (сервисный работник или микросервис Метеор) - PullRequest
0 голосов
/ 29 ноября 2018

Я использую meteor.js.Я хочу вызвать поток, который не зависит от потока, который его вызвал.Другими словами, порожденный поток остается без присмотра и не возвращает значение потоку, который его породил.Созданный поток обновит базу данных, а meteor позаботится об оперативном обновлении клиента.

Я сталкивался с сервисными работниками или микросервисом Meteor по следующим ссылкам: здесь и здесь

Как изменить приведенный ниже код на , определить и , позвонить работнику службы или микросервису.Я хочу изменить метод updateCompanyAmount в моем коде на сервисный работник / микросервис.Если есть другой способ определить и вызвать независимые / необслуживаемые потоки, пожалуйста, дайте мне знать.Причина, по которой мне нужны независимые / необслуживаемые потоки, заключается в том, что я хочу, чтобы мое приложение масштабировалось вертикально.Представьте себе ситуацию, когда более миллиона пользователей одновременно звонят по номеру updateCompanyAmount (который обновляет документ и значение коллекции общей базы данных) !!Соединения некоторых пользователей могут прерваться в ожидании снятия блокировки, чтобы они могли обновить общее значение.

Вот мой код.Пожалуйста, прочитайте четыре комментария в коде, чтобы быстро понять код.Пожалуйста, дайте мне решение в javascript.

if (Meteor.isServer) {
	Meteor.methods({
		//I want to "save purchase history" and then return to client while a new thread or service-worker "updates company amount"
		savePurchaseHistory: function(recharge,var1,var2,var3,var4,var5)
		{
			var userId = Meteor.userId();
			.
			.
			.
			PurchaseHistory.insert(recharge);
			Meteor.call("updateCompanyAmount",companyAmount);
		},
		//I want to change this function to a service-worker or Meteor microservise
		updateCompanyAmount: function(companyAmount,balance) {
                        //updateCompanyAmountRecursively method does the database update
			Meteor.call("updateCompanyAmountRecursively",companyAmount);
		},
		//CompanySharedNumbers collection can be updated by multiple users. In this example companyAmount in CompanySharedNumbers is being updated
		//by multiple users using a lock!
		updateCompanyAmountRecursively: function(companyAmount) {
			var userId = Meteor.userId();
			
			var user = Meteor.users.findOne({_id: userId});
			var random = Math.random();
			var companySharedNumbers = CompanySharedNumbers.findOne({_id: 'onlyOccurrence'});
			var locked = companySharedNumbers.updateLock;
			if (!locked)
			{
				CompanySharedNumbers.update({_id: 'onlyOccurrence',updateLock:locked},{$set:{updateRandomNumber:random,
						updateLock:!locked,updatedBy:user.username}});
				Meteor.users.update({_id: userId},{$set:{updateRandomNumber: random}});
			}
			
			user = Meteor.users.findOne({_id: userId});
			var userRandomNumber = user.updateRandomNumber;
			companySharedNumbers = CompanySharedNumbers.findOne({_id: 'onlyOccurrence'});
			var randomNumber = companySharedNumbers.updateRandomNumber;
			var updatedBy = companySharedNumbers.updatedBy;
			locked = companySharedNumbers.updateLock;
			if (locked)
			{
				if (randomNumber == userRandomNumber && updatedBy == user.username)
				{
					if (companySharedNumbers.companyAmount)
					{
						companyAmount = companyAmount + companySharedNumbers.companyAmount;
					}
					
					random = 2;
					CompanySharedNumbers.update({_id: 'onlyOccurrence',updateRandomNumber:userRandomNumber,updateLock:locked,updatedBy:user.username},{$set:
							{updateRandomNumber:random,updateLock:!locked,companyAmount:companyAmount,updatedBy:user.username}});
				}
				else
				{
					Meteor.call("updateCompanyAmountRecursively",companyAmount);
					return false;
				}
			}
			else
			{
				Meteor.call("updateCompanyAmountRecursively",companyAmount);
				return false;
			}
		}
	});
}
...