Caching
Commands must be executed quickly within 100 - 250 ms. If commands take a long time to complete, users have a bad impression of using the bot
Some commands cannot be executed quickly:
- HTTP loading
- mass message broadcasting
- Bot.runAll
Some commands can be very large or poorly coded:
- mass properting reading/setting (more then 20 properties in one command
- big (or infinite!) loops
- etc
if your code runs slower than 300ms - necessary:
- try to make it more quickly
- or cache it
- or run command on background and cache it (if needed)
If your code takes very long time it will be aborted with timeout error
Slow commands can cause your Cloud to degrade and even crash.
For example, let's say your cloud can process 1 request per second.
Thus, 4 requests of 250 ms each will be processed per second
But if you have slow commands (let's say one second), the cloud will process only one command instead of four.
Thus, the response to the first message will only be sent in a second. And the answer to the last is the fourth already in four.
Example set command caching for 1 hour (for all bot users):
Bot.sendMessage("Hello!");
Bot.setCache(
60*60 // time in seconds 60*60 = 1 hour
)
Example of command caching for 1 hour (for one user only):
User.sendMessage("Hello, " + user.first_name);
User.setCache(
60*60 // time in seconds 60*60 = 1 hour
)
you can clear Cache (it can be usefull on changing data)
Bot.clearCache(
"/command" // command Name
)
clear for user caching
User.clearCache(
"/command" // command Name
)
Caching is a powerful method for speeding up a bot. But you can't cache everything.
Criteria for caching:
- messages from the bot to this command do not change, or rarely change
- command accepts no params
(/command any param)
or options(Bot.run(command: "/cmd", options: options))
, or accepts them, but they rarely change - the result of the command is not critical. Even if the old, not updated value is returned, this is not critical
If your command does not meet these requirements try to devide it for several commands. One or more of them can be cached. To run them use methods:
Bot.run
or Bot.runCommand
You can PRE run caching in background for long command.
Command
/start
Bot.sendMessage("Welcome to my bot");
Bot.run({
command: "/longBackroundTask",
run_after: 1 // will be runned in background after 1 sec
})
Command
/longBackroundTask
// make your long task here...
Bot.getProperty("myJSON_1");
Bot.getProperty("myJSON_1");
// ... and etc...
Bot.getProperty("myJSON_100");
User.setCache(
60*60*24*7 // time in seconds - 60*60*24*7 it is week
)
command
/time
: var date = new Date();
var time = "Time: " +
+ date.getHours() + ":"
+ date.getMinutes() + ":"
+ date.getSeconds();
Bot.sendMessage(time);
We have such result (without caching) - take 250 ms:

Edit command for caching:
var date = new Date();
var time = "Time: " +
+ date.getHours() + ":"
+ date.getMinutes() + ":"
+ date.getSeconds();
Bot.sendMessage(time);
Bot.setCache(120); // caching for 120 seconds
Now we have such result - take 120 ms (instead 250 ms without caching):

Command result is changed only after 120 seconds. During that 120 seconds answer is same.
Last modified 3yr ago