Question about dispatch & backends

115 views
Skip to first unread message

Joshua Smith

unread,
Dec 11, 2020, 12:01:48 PM12/11/20
to google-a...@googlegroups.com
I have an app with a frontend UX that queries some backend APIs for information. Some of these APIs need more than 60 seconds to complete their work.

I *thought* I could solve this by doing the following:

1. Run the code on a B8 instance with a different service name
2. Set up dispatch.yaml to direct the incoming API requests to that service:

dispatch:

- url: "*/api/*"
  service: reporting

- url: "*/*"
  service: default

The dispatching is working correctly. I see this in my logs for an /api hit:

However, it's timing out:


My understanding was that a B8 instance didn't have the "gotta get it done in 60 seconds" rule that frontend instance types did.

What am I missing?

-Joshua

Elliott (Cloud Platform Support)

unread,
Dec 11, 2020, 4:44:45 PM12/11/20
to Google App Engine
Hello Joshua,

I understand that your program uses APIs that need more than 60 seconds to complete but even though you are using B8 instances in App Engine, your program times out past the 60 seconds. I’m assuming you are using App Engine Standard.

To find supporting documentation for you, can you tell me more about the "gotta get it done in 60 seconds" rule? Can you please give examples of this?

Joshua Smith

unread,
Dec 12, 2020, 10:11:28 AM12/12/20
to google-a...@googlegroups.com
https://cloud.google.com/appengine/docs/standard/python/how-instances-are-managed#timeout

My frontend service uses automatic scaling, so it has a 1 minute limit to respond. But my API service is a B8 with this:


which means that it should not be subjected to that limit. Yet when I send requests to it via the dispatch, it seems to be enforcing at 1 minute limit regardless.



-- 
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-appengi...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-appengine/7209920b-7b59-4dd4-84a6-e722e7df462bn%40googlegroups.com.

Manpreet Sidhu (Google Cloud Support)

unread,
Dec 13, 2020, 8:58:25 PM12/13/20
to Google App Engine
Even though your frontend uses automatic scaling, the work is being done on the B8 instance that is responsible for running your API service.

Based on the screenshot that you attached, the B8 instance has to return in 24 hours. This is due to the fact that the B8 instance is only capable of Manual and Basic scaling[0].

Can it be safe to assume that you are using a Legacy Runtime as that is where the limit of 1 minute is enforced. As an alternative, you can try routing with URLs[1] or look into implementing the use of Task Queues as that has a timeout of 10 minutes.

Joshua Smith

unread,
Dec 14, 2020, 9:14:08 AM12/14/20
to google-a...@googlegroups.com
I'm thinking you didn't read my initial message carefully, so let me try again.

Yes, I'm using the legacy runtime with the 1 minute limit on frontends.

Yes, I'm using the B8 with basic scaling for my API calls, which should not have that limit.

Yes, I'm using URL routing via dispatch.yaml, and have confirmed the B8 instance is handling the request by checking the logs.

The request is nonetheless failing because it's taking more than one minute. 

That should not be happening, according to the documentation. Unless there's another 1 minute limit somewhere else that I'm not aware of.

-Joshua

Linus Larsen

unread,
Dec 14, 2020, 11:27:15 AM12/14/20
to google-a...@googlegroups.com
I think I have seen some documentation way back that it was not possible to serve user facing requests from a B instance, instead you
were supposed to dispatch the request to a TaskQueue and use some sort of client polling in order to get notified when the work on B
instance was completed. 

Cannot find it anymore, the documentation has changed so much you don't really know what's the truth anymore.

/ Linus  

Joshua Smith

unread,
Dec 14, 2020, 11:49:57 AM12/14/20
to google-a...@googlegroups.com
When I hit the B8 with a request to its appspot.com address, those happily run for more than a minute. The issue seems to be related to dispatching. (I can't just have my front-end connect to the appspot address, because I need some cookies to be present, so cross-domain is out.)

-Joshua

Elliott (Cloud Platform Support)

unread,
Dec 14, 2020, 3:35:12 PM12/14/20
to Google App Engine
Hello Joshua,

I’m sorry the conversation in this thread is going on and you do not have the answer you need.  You indicated that the request is failing because it's taking more than one minute and that is not how the behavior is supposed to be according to documentation.

Because Google Groups is meant for general discussions, the next step is to either report a common issue here, since I could not find one at this time or go through regular support channels here to get 1 on 1 support.

I know this is frustrating after all the exchanges but one these options would be the best way to move forward.

Joshua Smith

unread,
Dec 15, 2020, 8:16:08 AM12/15/20
to google-a...@googlegroups.com
I've created the issue in the tracker.

Joshua Smith

unread,
Jan 11, 2021, 9:12:38 AM1/11/21
to google-a...@googlegroups.com
FYI, I've solved this puzzle.

The problem wasn't that the B8 instance was timing out in less than 60 seconds.

The problem was that I had the B8 set to max-instance = 1, so if two concurrent API requests came in, the dispatcher had nowhere to send the second request. It would hang around awhile, waiting for the B8 to free up, and eventually time out.

So the only "bug" here is that the error message from the dispatcher could be improved, by mentioning that the *reason* it timed out isn't that the server took too long, but rather that max-instances is too low.

-Joshua

On Dec 14, 2020, at 11:26 AM, Linus Larsen <linus....@epspot.com> wrote:

Reply all
Reply to author
Forward
0 new messages