• Как грамотно изолировать сервисы на linux-сервере?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Технологий конечно же есть.
    1) Это виртуализация - KVM/Xen
    На мой взгляд предпочтительнее KVM, лучше поддержка, не нужно специальное хост-ядро.
    Немного, процента на 2-3 проигрывает перед XEN, но в удобстве выигрывает однозначно. XEN - только линукс, и только со специальными патчами в ядре на хосте и клиенте.
    Фактически получаете полноценную виртуальную машину, ставите туже все, что душе угодно, хоть линукс, хоть BSD, хоть винду.
    Проблема одна - требует жесткого выделения ресурсов. Поэтому только десяток-другой виртуалок (да и то заивисит от нагрузок).
    По сравнению с железом, сожрет от 3 до 7-10 процентов производительности.
    Тем не менее: мой выбор KVM.
    2) Контейнеризация - Docker/LCX/Virtuozzo.
    Сразу скажу за virtuozzo - ничего про нее говорить не буду. В принципе - очень похожа на XEN.
    Остальные две основаны на CGroups, более того, docker внутри использует LXC.
    Docker - очень распространен и популярен, фактически лидер рынка. Заточен на запуск одной задачи в одном контейнере. Контейнеры можно объединять в группы.
    LXC/LXD - менее распростанен, но очень удобная технология, если нужно контейнеризировать окружение операционки с кучей процессов.

    Мы пользуем и Docker и LXC/LCD. И даже в LXC пускаем Docker.
    Все зависит от задачи.
    Нужен сервис с кучей процессов и окружением - LXC
    Нужен один процесс - docker.
    Нужно полноценное окружение с ядром, куртизанками и гусарами - KVM.

    По факту - около 10 виртуалок KVM, порядка 10 контейнеров LXC, и порядка 20 контейнеров Docker.
    Ответ написан
    7 комментариев
  • Как отправить большой файл(аудио или видео) на сервер с android приложения правильно?

    CellycoMobiles
    @CellycoMobiles
    indi developer @CellycoMobiles
    Взрослые разработчики используют заголовки. Никто не ограничивает вас в использовании заголовка Content-Range в запросе.

    Прошу прощения, позволю себе использовать синтаксис httpie.

    POST "/upload/"
    Content-Type:[MEDIA_TYPE]
    Content-MD5:[BASE64_MD5_FILE]
    Content-Range: bytes [FROM_BYTES]-[TO_BYTES]/[FILE_SIZE]
    file@file.ext

    Один эндпойнт. Без бойлерплейта из трех разных запросов.
    bytes 0-? : создаёт файл, рекомендовал бы создавать с именем md5;
    bytes ? -? : запись в файл
    bytes ? - total_size : запись в файл, проверка контрольной суммы, переименование.

    Размер чанка = ширина канала >> 1
    Ответ написан
    Комментировать
  • Как правильно задать структуру класса для json объекта?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Вот, с помощью Gson все парсится хорошо.

    PS. вместо lombook.Data просто создайте геттеры/сеттеры у внутреннего класса. Мне так удобнее.

    package com.mycompany;
    
    import java.lang.reflect.Type;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    
    public class ReTest {
    	
    	@lombok.Data
    	public static class MyData {
    		private String name;
    		private String lastName;
    	}
    	
    	public static void main(String[] args) {
    		
    		String  json = "{\n" + 
    				"   \"12:30\": [\n" + 
    				"     {\n" + 
    				"         name: \"someName\",\n" + 
    				"         lastName: \"someLastName\"\n" + 
    				"      },\n" + 
    				"      {\n" + 
    				"         name: \"someName2\",\n" + 
    				"         lastName: \"someLastName2\"\n" + 
    				"      }\n" + 
    				"   ],\n" + 
    				"   \"13:15\": [\n" + 
    				"       {\n" + 
    				"         name: \"someName3\",\n" + 
    				"         lastName: \"someLastName3\"\n" + 
    				"      },\n" + 
    				"      {\n" + 
    				"         name: \"someName4\",\n" + 
    				"         lastName: \"someLastName4\"\n" + 
    				"      }\n" + 
    				"   ]\n" + 
    				"}";
    		
    		Gson parser = new Gson(); // create json parser
    		Type type = new TypeToken<Map<String, MyData[]>>(){}.getType(); // create custom type
    		Map<String, MyData[]> data = parser.fromJson(json, type); // parse data to 
     		
    		for( Entry<String, MyData[]> d: data.entrySet()) {
    			System.out.printf("%s\n", d.getKey());
    
    			for(MyData e: d.getValue()) {
    				System.out.printf("       %s\n", e);
    			}
    			System.out.println();
    		}
    	}
    }

    И вывод.
    12:30
           ReTest.MyData(name=someName, lastName=someLastName)
           ReTest.MyData(name=someName2, lastName=someLastName2)
    
    13:15
           ReTest.MyData(name=someName3, lastName=someLastName3)
           ReTest.MyData(name=someName4, lastName=someLastName4)
    Ответ написан
    1 комментарий
  • Много маленьких запросов к REST API или один большой?

    rockon404
    @rockon404
    Frontend Developer
    Если у вас сейчас что-то вроде этого:
    GET '/posts/slug/'
    
    {
      post: { /* ... */ }
    }
    
    GET '/posts/slug/comments/'
    
    {
      comments: { /* ... */ }
    }
    
    GET '/posts/slug/comments/users/'
    
    {
      users: { /* ... */ }
    }
    
    GET '/posts/slug/author/'
    
    {
      author: { /* ... */ }
    }
    
    GET '/posts/slug/meta/'
    
    {
      meta: { /* ... */ }
    }


    то логично все связанные данные объединить в один запрос:
    GET '/posts/slug/'
    
    {
      post: { /* ... */ },
      linked: {
        users: { /* ... */ },
        comments: { /* ... */ },
        meta: { /* ... */ },
      },
    }
    Ответ написан
    Комментировать