You are browsing as Guest
Click here for list of discussions
Click here to login






Discussion: AMPS
You have read-only access
You may need to scroll to the right ...

Click here to view in strict time order
Click here to view in neighbourhood mode.

%3 N_20210214175243a_ColinWright    By ColinWright 2021/02/14 @ 17:52:43a -------------------------------- In the mid 1990s my colleagues and I created and used what was to us a new style of programming.        (select only this node)     N_20210214175243b_ColinWright    By ColinWright 2021/02/14 @ 17:52:43b -------------------------------- I'm sure it wasn't new, I'm sure others will say: "Oh, it's just XXXX" ... but to us it was new, and powerful, and let us do some difficult stuff easily.        (select only this node)     N_20210214175243a_ColinWright->N_20210214175243b_ColinWright N_20210214175243c_ColinWright    By ColinWright 2021/02/14 @ 17:52:43c -------------------------------- So I'm going to describe the AMPS.        (select only this node)     N_20210214175243b_ColinWright->N_20210214175243c_ColinWright N_20210214175634a_ColinWright    By ColinWright 2021/02/14 @ 17:56:34a -------------------------------- We were implementing a large and complex system with lots of "moving parts".        (select only this node)     N_20210214175243c_ColinWright->N_20210214175634a_ColinWright N_20210214183247a_ColinWright    By ColinWright 2021/02/14 @ 18:32:47a -------------------------------- * [A] nonymous * [M] essage * [P] assing * [S] ystem        (select only this node)     N_20210214175243c_ColinWright->N_20210214183247a_ColinWright N_20210214224346a_ColinWright    By ColinWright 2021/02/14 @ 22:43:46a -------------------------------- In the interests of full-disclosure, some of what follows is not true, because there are some things I still can't say about the system. So bit of this are true, some bits are not true, but the overall message being given to you, the reader, is accurate enough.        (select only this node)     N_20210214175243c_ColinWright->N_20210214224346a_ColinWright N_20210214180557a_RDS    By RDS 2021/02/14 @ 18:05:57a -------------------------------- The RDS        (select only this node)     N_20210214175634a_ColinWright->N_20210214180557a_RDS N_20210214175634b_ColinWright    By ColinWright 2021/02/14 @ 17:56:34b -------------------------------- Among the many challenges was the fact that the system as a whole would be running across multiple machines on multiple sites, connected by different types of links with different capacities.        (select only this node)     N_20210214175634a_ColinWright->N_20210214175634b_ColinWright N_20210214175634d_ColinWright    By ColinWright 2021/02/14 @ 17:56:34d -------------------------------- The system as implemented wouldn't know at the time of implementation where the various components would run ... that had to be configurable and extensible.        (select only this node)     N_20210214175634b_ColinWright->N_20210214175634d_ColinWright N_20210214175634c_ColinWright    By ColinWright 2021/02/14 @ 17:56:34c -------------------------------- Some of the links would be reliable, others would be unreliable.        (select only this node)     N_20210214175634b_ColinWright->N_20210214175634c_ColinWright N_20210214191013a_ColinWright    By ColinWright 2021/02/14 @ 19:10:13a -------------------------------- Though mostly that would be dealt with by the nature of the traffic the different links carry.        (select only this node)     N_20210214175634c_ColinWright->N_20210214191013a_ColinWright N_20210214180557c_RDS    By RDS 2021/02/14 @ 18:05:57c -------------------------------- Create the digital data stream        (select only this node)     N_20210214180557d_RDS    By RDS 2021/02/14 @ 18:05:57d -------------------------------- Filter the digital stream        (select only this node)     N_20210214180557c_RDS->N_20210214180557d_RDS N_20210214224854a_ColinWright    By ColinWright 2021/02/14 @ 22:48:54a -------------------------------- Note also that I've not bothered to make all the tenses consistent. There are parts in the past tense, and some in the "historical present" ... this is a first-pass brain dump, don't expect consistency or wonderful prose.        (select only this node)     N_20210214233122c_ColinWright    By ColinWright 2021/02/14 @ 23:31:22c -------------------------------- All the machines and networks in this system were trusted ... we did a full security audit of the threat models and possible concerns. But we didn't have to perform authentication of any type.        (select only this node)     N_20210214233122d_ColinWright    By ColinWright 2021/02/14 @ 23:31:22d -------------------------------- Having said that, designing an equivalent system from the ground up with modern crypto and auth seems achievable.        (select only this node)     N_20210214233122c_ColinWright->N_20210214233122d_ColinWright N_20210214204719a_ColinWright    By ColinWright 2021/02/14 @ 20:47:19a -------------------------------- To describe the system, let's start with a specific module ... the control panel.        (select only this node)     N_20210214175634d_ColinWright->N_20210214204719a_ColinWright N_20210214180557b_RDS    By RDS 2021/02/14 @ 18:05:57b -------------------------------- Source of analogue data        (select only this node)     N_20210214180557a_RDS->N_20210214180557b_RDS N_20210214180557b_RDS->N_20210214180557c_RDS N_20210214180557i_RDS    By RDS 2021/02/14 @ 18:05:57i -------------------------------- Filter specific to transmission        (select only this node)     N_20210214180557d_RDS->N_20210214180557i_RDS N_20210214180557e_RDS    By RDS 2021/02/14 @ 18:05:57e -------------------------------- Filter specific to secondary processing        (select only this node)     N_20210214180557d_RDS->N_20210214180557e_RDS N_20210214181738a_RDS    By RDS 2021/02/14 @ 18:17:38a -------------------------------- Controls        (select only this node)     N_20210214180557d_RDS->N_20210214181738a_RDS N_20210214180557f_RDS    By RDS 2021/02/14 @ 18:05:57f -------------------------------- Create secondary data        (select only this node)     N_20210214180557e_RDS->N_20210214180557f_RDS N_20210214180557e_RDS->N_20210214181738a_RDS N_20210214180557g_RDS    By RDS 2021/02/14 @ 18:05:57g -------------------------------- Send to correlation system        (select only this node)     N_20210214180557f_RDS->N_20210214180557g_RDS N_20210214180557f_RDS->N_20210214181738a_RDS N_20210214181946a_RDS    By RDS 2021/02/14 @ 18:19:46a -------------------------------- Correlation system        (select only this node)     N_20210214180557g_RDS->N_20210214181946a_RDS N_20210214180557h_RDS    By RDS 2021/02/14 @ 18:05:57h -------------------------------- User console        (select only this node)     N_20210214180557j_RDS    By RDS 2021/02/14 @ 18:05:57j -------------------------------- Compression        (select only this node)     N_20210214180557i_RDS->N_20210214180557j_RDS N_20210214180557i_RDS->N_20210214181738a_RDS N_20210214180557k_RDS    By RDS 2021/02/14 @ 18:05:57k -------------------------------- Encoding        (select only this node)     N_20210214180557j_RDS->N_20210214180557k_RDS N_20210214180557j_RDS->N_20210214181738a_RDS N_20210214180557l_RDS    By RDS 2021/02/14 @ 18:05:57l -------------------------------- Broadcast to "Cloud"        (select only this node)     N_20210214180557k_RDS->N_20210214180557l_RDS N_20210214180557k_RDS->N_20210214181738a_RDS N_20210214180557m_RDS    By RDS 2021/02/14 @ 18:05:57m -------------------------------- "Cloud"        (select only this node)     N_20210214180557l_RDS->N_20210214180557m_RDS N_20210214180557n_RDS    By RDS 2021/02/14 @ 18:05:57n -------------------------------- Listen to "Cloud"        (select only this node)     N_20210214180557m_RDS->N_20210214180557n_RDS N_20210214181738b_RDS    By RDS 2021/02/14 @ 18:17:38b -------------------------------- (In truth these are bi-directional links, with control going one way and values coming back for display, but the control structures aren't all being shown here for simplicity.)        (select only this node)     N_20210214181738a_RDS->N_20210214181738b_RDS N_20210214181946a_RDS->N_20210214180557h_RDS N_20210214211826a_ColinWright    By ColinWright 2021/02/14 @ 21:18:26a -------------------------------- But there's an additional bonus.        (select only this node)     N_20210214211826b_ColinWright    By ColinWright 2021/02/14 @ 21:18:26b -------------------------------- We can write a program that has input and output mailboxes, but whose purpose is to tunnel them to an equivalent bridging program on another machine.        (select only this node)     N_20210214211826a_ColinWright->N_20210214211826b_ColinWright N_20210214211826c_ColinWright    By ColinWright 2021/02/14 @ 21:18:26c -------------------------------- So suddenly with almost no work we can run our system seamlessly across multiple machines.        (select only this node)     N_20210214223852a_ColinWright    By ColinWright 2021/02/14 @ 22:38:52a -------------------------------- We could put cleavage planes across the wiring diagram and record entire sequences just by inserting a recording process.        (select only this node)     N_20210214211826c_ColinWright->N_20210214223852a_ColinWright N_20210214233122a_ColinWright    By ColinWright 2021/02/14 @ 23:31:22a -------------------------------- It's worth noting:        (select only this node)     N_20210214211826c_ColinWright->N_20210214233122a_ColinWright N_20210214223553a_ColinWright    By ColinWright 2021/02/14 @ 22:35:53a -------------------------------- The messages are a lot like UDP packets. We don't say anything about what's in them, we rely on the programmer sending and receiving the right sort of format for each defined output/input pair.        (select only this node)     N_20210214223553b_ColinWright    By ColinWright 2021/02/14 @ 22:35:53b -------------------------------- This preceded JSON by half a decade at least, so we invented various formats for packets.        (select only this node)     N_20210214223553a_ColinWright->N_20210214223553b_ColinWright N_20210214223553c_ColinWright    By ColinWright 2021/02/14 @ 22:35:53c -------------------------------- Some links carried images, but we actually allocated memory for the image and passed pointers ...        (select only this node)     N_20210214223553d_ColinWright    By ColinWright 2021/02/14 @ 22:35:53d -------------------------------- ... unless the receiving program was on another machine. But the AMPS handled that for us.        (select only this node)     N_20210214223553c_ColinWright->N_20210214223553d_ColinWright N_20210214223553e_ColinWright    By ColinWright 2021/02/14 @ 22:35:53e -------------------------------- Some programs sat waiting for a message to process, and if no messages with data came in would do nothing. But they might have background processing to do, so the system could be synchonised (where necessary) by sending "Chronons".        (select only this node)     N_20210214223553e_ColinWright->N_20210214223852a_ColinWright N_20210214223852b_ColinWright    By ColinWright 2021/02/14 @ 22:38:52b -------------------------------- Then the second half could be run again by replaying messages from the recording process.        (select only this node)     N_20210214223852a_ColinWright->N_20210214223852b_ColinWright N_20210214223852c_ColinWright    By ColinWright 2021/02/14 @ 22:38:52c -------------------------------- We did implement snap-shotting of processes and tied the snapshots to chronons, and that letus do a form of time-travel.        (select only this node)     N_20210214223852d_ColinWright    By ColinWright 2021/02/14 @ 22:38:52d -------------------------------- It wasn't completely generic, but it came almost for free.        (select only this node)     N_20210214223852c_ColinWright->N_20210214223852d_ColinWright N_20210214224104a_ColinWright    By ColinWright 2021/02/14 @ 22:41:04a -------------------------------- Many, but not all, of the programs were designed to be able to be started and connected in at any time, so we could hot-swap upgraded processes.        (select only this node)     N_20210214224104b_ColinWright    By ColinWright 2021/02/14 @ 22:41:04b -------------------------------- The system was soft-realtime safety critical, so that was an especially useful feature.        (select only this node)     N_20210214224104a_ColinWright->N_20210214224104b_ColinWright N_20210214224346a_ColinWright->N_20210214224854a_ColinWright N_20210214233122b_ColinWright    By ColinWright 2021/02/14 @ 23:31:22b -------------------------------- THERE WAS NO SECURITY ON THIS SYSTEM!        (select only this node)     N_20210214233122a_ColinWright->N_20210214233122b_ColinWright N_20210214180557n_RDS->N_20210214180557h_RDS N_20210214191013b_ColinWright    By ColinWright 2021/02/14 @ 19:10:13b -------------------------------- For some traffic we didn't mind losing packets ... when we did mind losing packets we used reliable links ... obviously.        (select only this node)     N_20210214191013a_ColinWright->N_20210214191013b_ColinWright N_20210214204719b_ColinWright    By ColinWright 2021/02/14 @ 20:47:19b -------------------------------- A control panel has a set of controls (obviously). Each control receives the value the user (who whoever) wants the embodied quantity to take, and periodically returns the value the quantity currently has.        (select only this node)     N_20210214204719a_ColinWright->N_20210214204719b_ColinWright N_20210214204719c_ColinWright    By ColinWright 2021/02/14 @ 20:47:19c -------------------------------- Often these are immediately the same, but in our context we might want to tell the system a target value, and then we get reports on how it's getting on.        (select only this node)     N_20210214204719b_ColinWright->N_20210214204719c_ColinWright N_20210214204719d_ColinWright    By ColinWright 2021/02/14 @ 20:47:19d -------------------------------- So the control panel sporadically receives a value, and sends back values on some schedule.        (select only this node)     N_20210214204719c_ColinWright->N_20210214204719d_ColinWright N_20210214204719e_ColinWright    By ColinWright 2021/02/14 @ 20:47:19e -------------------------------- But the control panel might not (and in general will not) be on the same machine as the quantity being controlled.        (select only this node)     N_20210214204719d_ColinWright->N_20210214204719e_ColinWright N_20210214204719f_ColinWright    By ColinWright 2021/02/14 @ 20:47:19f -------------------------------- So we wrote a program that opens a panel in the GUI and displays a value, and has a slider (or something). Then it passes the setting from the user to the AMPS, and receives from the AMPS the value of the remote quantity.        (select only this node)     N_20210214204719e_ColinWright->N_20210214204719f_ColinWright N_20210214204719g_ColinWright    By ColinWright 2021/02/14 @ 20:47:19g -------------------------------- This gives us the basic idea: Each program has a collection of output mailboxes on which messages are sent, and a collection of input mailboxes where messages are received.        (select only this node)     N_20210214204719f_ColinWright->N_20210214204719g_ColinWright N_20210214204719h_ColinWright    By ColinWright 2021/02/14 @ 20:47:19h -------------------------------- This is not new, but we made it absolutely explicit.        (select only this node)     N_20210214204719g_ColinWright->N_20210214204719h_ColinWright N_20210214204719i_ColinWright    By ColinWright 2021/02/14 @ 20:47:19i -------------------------------- A system consists of a collection of programs and a "Wiring Diagram".        (select only this node)     N_20210214204719h_ColinWright->N_20210214204719i_ColinWright N_20210214204719j_ColinWright    By ColinWright 2021/02/14 @ 20:47:19j -------------------------------- Each program has:        (select only this node)     N_20210214204719i_ColinWright->N_20210214204719j_ColinWright N_20210214205138a_ColinWright    By ColinWright 2021/02/14 @ 20:51:38a -------------------------------- The system is many-to-many ... each output can be connected to any number of receiving mailboxes, including possibly none, and each input mailbox can receive messages from any number of sending mailboxes, including none.        (select only this node)     N_20210214204719i_ColinWright->N_20210214205138a_ColinWright N_20210214205637b_ColinWright    By ColinWright 2021/02/14 @ 20:56:37b -------------------------------- In particular, each program can have a mailbox for debug messages.  If we're not debugging that output can remain unconnected.        (select only this node)     N_20210214205637c_ColinWright    By ColinWright 2021/02/14 @ 20:56:37c -------------------------------- Alternatively, we can have a debug module that always receives the messages, but if we don't care then the messages are discarded.        (select only this node)     N_20210214205637b_ColinWright->N_20210214205637c_ColinWright N_20210214204719m_ColinWright    By ColinWright 2021/02/14 @ 20:47:19m -------------------------------- The "Wiring Diagram" says which output box is attached to which input box.        (select only this node)     N_20210214204719m_ColinWright->N_20210214205138a_ColinWright N_20210214205637a_ColinWright    By ColinWright 2021/02/14 @ 20:56:37a -------------------------------- Suddenly the system breaks naturally into separate pieces that talk to each other. They are connected via the AMPS, with the programs each doing one thing, and not caring where the data comes from, or where the answers go to.        (select only this node)     N_20210214205138a_ColinWright->N_20210214205637a_ColinWright N_20210214210045a_ColinWright    By ColinWright 2021/02/14 @ 21:00:45a -------------------------------- When we have process A sending data to process C, we would have A->B in the wiring diagram.        (select only this node)     N_20210214205637a_ColinWright->N_20210214210045a_ColinWright N_20210214205637a_ColinWright->N_20210214211826a_ColinWright N_20210214205637a_ColinWright->N_20210214223553a_ColinWright N_20210214205637a_ColinWright->N_20210214205637b_ColinWright N_20210214181738b_RDS->N_20210214180557h_RDS N_20210214210045b_ColinWright    By ColinWright 2021/02/14 @ 21:00:45b -------------------------------- Then if we want to filter that data stream we can simply re-wire to have A->X->B.        (select only this node)     N_20210214210045a_ColinWright->N_20210214210045b_ColinWright N_20210214210045c_ColinWright    By ColinWright 2021/02/14 @ 21:00:45c -------------------------------- We can swap out different filters as required.        (select only this node)     N_20210214210045b_ColinWright->N_20210214210045c_ColinWright N_20210214210045c_ColinWright->N_20210214224104a_ColinWright N_20210214210045c_ColinWright->N_20210214211826a_ColinWright N_20210215095938a_RDS    By RDS 2021/02/15 @ 09:59:38a -------------------------------- This is an outline of the system in question, with (roughly speaking) a node here for each process in the system.        (select only this node)     N_20210214220829a_RDS    By RDS 2021/02/14 @ 22:08:29a -------------------------------- I can only describe this in generalities ...        (select only this node)     N_20210215095938a_RDS->N_20210214220829a_RDS N_20210214211826b_ColinWright->N_20210214211826c_ColinWright N_20210214220829a_RDS->N_20210214180557a_RDS N_20210214223553b_ColinWright->N_20210214223553c_ColinWright N_20210214223553d_ColinWright->N_20210214223553e_ColinWright N_20210214223852b_ColinWright->N_20210214223852c_ColinWright N_20210214224104b_ColinWright->N_20210214233122a_ColinWright N_20210214233122b_ColinWright->N_20210214233122c_ColinWright N_20210214204719l_ColinWright    By ColinWright 2021/02/14 @ 20:47:19l -------------------------------- A set of input mailboxes        (select only this node)     N_20210214204719j_ColinWright->N_20210214204719l_ColinWright N_20210214204719k_ColinWright    By ColinWright 2021/02/14 @ 20:47:19k -------------------------------- A set of output mailboxes        (select only this node)     N_20210214204719j_ColinWright->N_20210214204719k_ColinWright N_20210214204719k_ColinWright->N_20210214204719m_ColinWright N_20210214204719l_ColinWright->N_20210214204719m_ColinWright