Adam Sah
unread,Sep 24, 2011, 2:23:02 PM9/24/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to Google App Engine
hey guys--
If you're using Tasks and haven't tried public, dynamic Backends yet,
they're wonderful:
- for tiny apps, you can offload another $0.72/day for free (they're
dynamic!)
- for medium apps, it's a super easy way to get more RAM
- easy migration from Tasks running on frontends to running them on
public, dynamic backends (incl development, debugging, etc.)
- nearly identical debugging/production methods as frontend Tasks
- since they're public, you can launch Tasks directly on the backend,
removing the frontend from the equation, e.g. you can test out how a
Task will perform on a backend, before committing to the architecture
change.
- cool trick: keep the fast Tasks running on frontends, and use the
(expensive) backends for RAM-intensive jobs-- this is a tiny code
change, and also makes it easier to debug large jobs because the
console isn't flooded with little jobs. For my app, I use Tasks for
various indexing jobs in an online marketplace-- now, I send the
"large" sellers with 1000s of SKUs, to a B4 backend.
GAE team:
- I've noticed that my backends can 500-error but not produce a stack
trace in the logs? are other people seeing this?
my choice of migration: (python)
1. create backends.xml, define *one* backend, e.g.
backends:
- name: backend2647324 # since it's public, give it a hard-to-
guess name
class: B4 # big+fast without blowing the free budget
options: dynamic, public
2. add backend-enabled queued, by copying queues from frontends:
queue:
- name: image-processor
...other options here...
- name: image-processor-backend # note how I append "-backend"
to the name
target: backend2647324
...other options here...
3. in your code, start firing Tasks at the backend
# see bottom for taskname() trick
taskqueue.add(url=..., name=taskname("some-identifier-i-will-
recognize"),
queue_name="image-thumbnailer"+("-backend" if
is_gigantic_image(...) else ""))
4. modify your deploy script to update both the front & backends.
Mine (legacy) is in perl:
# deploy bar ==> deploys to foo-bar and to foo-bar-backend
# deploy bar-backend ==> deploys to foo-bar-backend only
# deploy bar-frontend ==> deploys to foo-bar only
$DEST = pop(@ARGV);
my $push_frontend = 1;
if ($DEST =~ s/-backend//) { $push_frontend = 0; }
my $push_backend = 1;
if ($DEST =~ s/-frontend//) { $push_backend = 0; }
if ($push_frontend) {
open(FH, "echo ".$ENV{"GAEPASSWD"}."|python2.5 ".$ENV{"GAEDIR"}."/
appcfg.py --email=".$ENV{"GAEUSER"}." --passin --application=foo-$DEST
update .|");
while (<FH>) { print; }
close FH;
}
if ($push_backend) {
open(FH, "echo ".$ENV{"GAEPASSWD"}."|python2.5 ".$ENV{"GAEDIR"}."/
appcfg.py --email=".$ENV{"GAEUSER"}." --passin --application=foo-$DEST
backends . update|");
while (<FH>) { print; }
close FH;
}
that's it! now, some jobs will go to the frontends and others to the
backends.
hope this helps,
adam
def taskname(string):
"""safely create Google App Engine Task names."""
# add timestamp and random for ultimate uniqueness, strip disallowed
chars
rnd_salt = str(random.randint(100000, 999999))
return re.sub(r'[^a-zA-Z0-9-]', '-', string +
str(datetime.datetime.now())) + "-" + rnd_salt